@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]
。