正如@fsimonazzi 所提到的,“a”将是一个局部变量。
话虽如此,仍然没有办法检查当前的比较操作,因为在 MSIL 中没有 IF 块的正式概念 - 只有条件跳转。
如果您想对反射感到非常疯狂,您也许可以找到当前正在执行的指令并在其附近四处寻找变量,但即便如此,您也不会找到名称 - 只是一个参考 - 因为名称仅用于在编译之前。
无论哪种方式,反思在这里都不会帮助你。
相反,请尝试使用 Exceptions - 特别是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]
。