0

我如何知道日志中最后一个为空的属性?

例如,

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

   //blah blah
}

就像我如何使用反射来获取当前方法名称一样,应该有一些方法可以记录正在比较的最新局部变量(或属性或字段)?顺便说一下,我使用 log4net 来记录错误。

1)有什么方法可以实现这一点还是我们应该手动记录它?

2) 是否有任何自定义方法可以打印为空的类 -> MethodName -> Propertyname(或 FieldName)?

提前感谢您的时间。

4

1 回答 1

2

正如@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]

于 2012-11-21T16:07:19.323 回答