我们有一个“logger”类,它具有获取日志消息的log方法,并将消息和调用方法写入日志,首先我们还执行以下操作以向日志方法发送新参数{{1} }。 我找到了另一种方法,使用Relection.MethodBase:
Method.Base.GetCurrentMethod()
但是我有一个问题,每次调用log方法时,我都被迫从public void Log(string message)
{
stackTrace = new StackTrace();
string methodName = stackTrace.GetFrame(1).GetMethod().Name;
....
}
创建新实例,当我尝试在构造函数中创建实例时,我得到的方法名是StackTrace
。
我们在项目中使用MEF。 任何想法如何改进代码?
答案 0 :(得分:6)
如果您使用的是最新版本的C#(5),则会通过call-site属性将其内置到语言中。你可以这样使用它:
public void Log(string message, [CallerMemberName] string methodName = null)
{
}
在不提供第二个参数的情况下调用方法,C#编译器会自动为您填写。您可以使用以下呼叫站点属性:CallerMemberName,CallerLineNumber和CallerFilePath。
答案 1 :(得分:3)
我建议使用“信息日志”的完整堆栈跟踪(没有异常详细信息的日志),使用
StackTrace stackTrace = new StackTrace(true);
string stackTraceString = stackTrace.ToString();
将为您提供包含源信息的完整堆栈跟踪。
但是当你有具有异常实例的日志时,例如catch语句中的日志,你可以使用堆栈跟踪和异常本身的内部异常信息,而不仅仅是调用方法。
StackTrace stackTrace = new StackTrace(ex, true);
string stackTraceString = stackTrace.ToString();
虽然(ex)是您需要它的堆栈跟踪的例外。
*编辑*
或者您可以使用:
Environment.StackTrace,它是一个字符串属性!但是包含了get_StackTrace的调用,你可以编写一个简单的代码来删除这个部分,但我认为可以随意制作堆栈跟踪对象,这不是什么大问题。
答案 2 :(得分:1)
在实施解决方案之前,您应该了解方法内联。
看看Scott Hanselman撰写的this article,他试图实现几乎相同的功能。更多信息here
答案 3 :(得分:0)
您可以将PostSharp用于此目的。请查看this页面,了解如何改进代码的示例。