为什么使用Caller信息属性

时间:2013-03-12 22:27:41

标签: logging .net-4.5 stack-trace c#-5.0

在堆栈跟踪对象上使用调用者信息属性更好吗?有什么区别?

请考虑以下使用调用者信息属性进行日志记录的代码。

public void Log(
    string message,
    [CallerMemberName] string memberName = null,
    [CallerFilePath] string filePath = null,
    [CallerLineNumber] int lineNumber = 0)
{
    // Do logging.
}

从我的测试中,使用StackTrace类可以获得相同的结果。

public void Log(string message)
{
    StackTrace trace = new StackTrace(true);
    StackFrame frame = trace.GetFrame(1);

    string filePath = frame.GetFileName();
    int lineNumber = frame.GetFileLineNumber();
    string memberName = frame.GetMethod().Name;

    // Do logging.
}

我见过的唯一区别是匿名方法,其中StackTrace包含调用方法的生成名称,如<MyMethod>b_a

我不喜欢调用者信息属性的一件事是,尽管它们不必作为参数传递,但它们必须在每个使用它们的方法上定义为方法参数,违反DRY原理

0 个答案:

没有答案