0

null である最後のプロパティをログに記録するにはどうすればよいですか?

例えば、

var a = "somevalue";
......
......
if(a == null)
{
   Log.Error(MethodBase.GetCurrentMethod().Name  + "Property : a is null");      

   //blah blah
}

リフレクションを使用して現在のメソッド名を取得する方法と同様に、比較されている最新のローカル変数 (またはプロパティまたはフィールド) をログに記録できる手段が必要ですか? ちなみに、エラーをログに記録するためにlog4netを使用しています。

1)これを達成する方法はありますか、それとも手動でログに記録する必要がありますか?

2) null であるクラス -> MethodName -> Propertyname(または FieldName) を出力するカスタム メソッドはありますか?

お時間をいただきありがとうございます。

4

1 に答える 1

2

@fsimonazzi で述べ​​たように、「a」はローカル変数になります。

MSILにはIFブロックの正式な概念がなく、条件付きジャンプのみであるため、現在の比較操作を調べる方法はまだありません。

リフレクションに本当に夢中になりたい場合は、現在実行中の命令を見つけて、その近くで変数を探すことができるかもしれませんが、それでも、名前は使用されるだけなので、名前は見つからず、参照のみです。コンパイル前。

いずれにせよ、リフレクションはここでは役に立ちません。

代わりに、例外、具体的にはArgumentNullExceptionを使用してみてください。このコード本体は次のようになります。

void doStuff(string param1, int param2)
{
    if (param == null)
        throw new ArgumentNullException("param1", "param1 must not be null");
    if (param2 < 0)
        throw new ArgumentOutOfRangeException("param2", "param2 should be non-negative.");

    //method body
}

次に、メソッドを呼び出すと、例外が何であれ、例外をキャッチしてログに記録できます。

public static void Main(string[] args)
{
    try 
    {
        doStuff(null, 3);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex);
    }
}

FxCopなどのツールは、各パラメーターを適切に検証するのに役立ちます。


プロパティは実際にはメソッドとして実装されるため、リフレクションが役立ちます。たとえば、プロパティで検証していて、位置を自動的に記録したい場合は、それが可能です。

private object _cachedObject = null;
public object CachedObject 
{
    get 
    {
        if (_cachedObject == null)
        {
            log(MethodBase.GetCurrentMethod().Name, "creating cached object");
            _cachedObject = createCachedObject();
        }
        return _cachedObject;
    }
}

.Net Framework 4.5 にはMethodBase.GetCurrentMethod().Name、メソッド名を取得するために使用している構造を置き換えるために使用できる新しい属性も含まれています。を参照してください[CallerMemberNameAttribute][3]

于 2012-11-21T16:07:19.323 に答える