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 原则。

4

0 回答 0