2009-04-23 28 views
1

ログとログの対象を制御するために、いくつかの条件付きでLoggerクラスを拡張しようとしています。条件付きメソッドを呼び出す条件付きメソッドがC#で動作しない

#define Logging 
#define VerboseLogging 

static void Main(string[] args) 
{ 
    Logger.Log("Logging", ""); 
    Logger.VerboseLog("VerboseLogging", ""); 
} 

は「VerboseLoggingを」行方不明出力のみ「ログ」を、生成次のプログラムを実行している、しかし

public static class Logger 
{ 
    [Conditional("Logging"), Conditional("VerboseLogging")] 
    public static void Log(string msg, string filename) 
    { 
     // log to file 
    } 

    [Conditional("VerboseLogging")] 
    public static void VerboseLog(string msg, string filename) 
    { 
     Log(msg, filename); // just defer call to Log(string msg) 
    } 
} 

:私は、ログ機能の2種類を持っています。

アプリケーションをデバッグすると、実際にVerboseLoggingが呼び出されたことがわかりましたが、Log(msg, filename)は呼び出されませんでした。デバッガは、関数呼び出しの末尾にある関数VerboseLog()のすぐ上にジャンプします。

Log(string msg)メソッドから条件を削除すると機能します。

なぜこのようなことが起こるのか、何をするべきかという手掛かりは誰にもありますか?

+0

私はあなたがそれを持っているのと全く同じようにアプリケーションを構築しました。発生している問題を再現することができません。 –

+0

バイナリが正しく再構築されていない可能性がありますか?クリーンなビルドをやってみましたか? –

+0

はい、すでに数回試しています。もちろん、私のアプリケーションには、CSVを読み込み、ファイルにログを記録するなど、VerbosLog(...)が呼び出される理由はわかりませんが、VerboseLog()の本体にあるLog()の呼び出しにジャンプします。 –

答えて

3

注意を持っていません。

プロジェクト全体の条件付き定義を追加するには、プロジェクトを右クリックし、[プロジェクトのプロパティ]を選択します。次に、[ビルド]タブに移動し、[条件付きコンパイルシンボル]テキストボックスに「ログ、VerboseLogging」と入力します。

+0

それはそれだった!ありがとうございました。 –

0

条件が逆さまになっていませんか? ie

[Conditional("Logging")] 
public static void Log(string msg, string filename) { } 

[Conditional("Logging"), Conditional("VerboseLogging")] 
public static void VerboseLog(string msg, string filename) { 
    Log(msg, filename); // just defers call to Log() 
} 
+0

いいえ、私はそう信じていません。オペレーションは両方の状況でLogが発生することを望んでいますが、VerboseLogging条件でのみVerboseLogが発生します。 –

+0

それでも、VerboseLoggingとLoggingの両方が定義されています。 –

+0

ジェフ・イェイツが正しいです。両方の場合に、VerboseLoggingが定義されている場合にのみVerboseLogがログに記録されます。 –

0

実際のヘルプはありませんが、投稿したコードはここではうまくいきます(.NET 3.5 SP1コンソールアプリケーション)。もちろん、私はmainの呼び出しがそれを供給しないので、filenameパラメータを削除する必要がありますが、両方とも定義されていない限り、両方のログにはログが与えられ、冗長ログのみがログに記録されます。問題にオッカムの剃刀を適用

:あなたは明らかに掲示コードは、ソース(logメソッドのための無体と不足しているパラメータ)から直接されていないので、あなたは、あなたの中で正しく定義を綴られてきた確認です元のソース?それ以外は、私はそれがあなたのために働いていない理由は考え...あなたはVerboseLogが定義されていないLogLogging場合は呼び出しませんので、またあなたのLogger ファイルにLoggingVerboseLoggingを定義する必要があり

+0

コードをテストしていただきありがとうございます!私はどこでも "VerboseLogging"をコピーしましたが、まだ動作しません。奇妙なことに、VerboseLog()メソッドは呼び出されますが、本体の中にはLog()は呼び出されません。それはそれを飛び越える。 –

+1

ああ、本当の答えが投稿されたので、私はコーナーをカットし、すべてのクラスを単一のソースファイルに入れることが、この問題をテストする最もインテリジェントな方法ではないことがわかりました。生きて、私が推測することを学ぶ... –

関連する問題