在堆栈跟踪对象上使用调用者信息属性更好吗?有什么区别?
请考虑以下使用调用者信息属性进行日志记录的代码。
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原理