如何在C#中改进get调用方法的代码

时间:2012-12-16 08:24:52

标签: c# mef stack-trace silverlight-5.0

我们有一个“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。 任何想法如何改进代码?

4 个答案:

答案 0 :(得分:6)

如果您使用的是最新版本的C#(5),则会通过call-site属性将其内置到语言中。你可以这样使用它:

public void Log(string message, [CallerMemberName] string methodName = null)
{
}

在不提供第二个参数的情况下调用方法,C#编译器会自动为您填写。您可以使用以下呼叫站点属性:CallerMemberNameCallerLineNumberCallerFilePath

答案 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页面,了解如何改进代码的示例。