1

可能重复:
如何在 C# 中获取调用方法

我有一个Log类应该将其客户端的类和方法添加到记录的消息中,如下所示:

[ClientClass.ClientMethod] This is the logged message.

我正在寻找一种Log中获取这些值的安全方法,而无需将其作为参数从客户端传递。到目前为止,我已经尝试过:

var stackFrame = new StackFrame(StackFramesToSkip);
var method = stackFrame.GetMethod();
return string.Format("[{0}.{1}] {2}", method.DeclaringType.Name, method.Name, message);

但是,此方法并不总是产生调用方法。尤其是在使用多个线程时。

有没有一种安全的方法来做到这一点?我没主意了。

谢谢!

4

1 回答 1

2

您可以使用System.Reflection.MethodBase.GetCurrentMethod()获取当前方法的名称并将名称传递给参数,但您说您不想要这些。好吧,我知道其他几种方法。

  1. 对于 .NET 4.5 beta,您可以使用此Caller Information
  2. 您可以使用动态代理。日志记录方法仍然需要一个参数,但动态代理允许您只进行一次调用,并将其动态添加到您的方法中。您可以使用ContextBoundObjectCastle Dynamic Proxy
  3. 您可以使用 AOP 框架。这允许您执行类似于 (2) 的操作,但它更简洁。基本上,根据框架,可以在构建时静态而不是动态地添加调用。这是一个很好的 AOP 框架:PostSharp

有一次我必须这样做,我手动添加了调用。起初我认为这会令人生畏,但就我而言,它并没有那么糟糕。我有非常有限的各种记录方法(那些与 COM 通信的方法)。

于 2012-05-30T15:59:12.603 回答