找到调用方法和类的安全方法

时间:2012-05-30 15:55:30

标签: c# .net reflection

  

可能重复:
  How I can get the calling methods in 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);

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

有没有一种安全的方法呢?我没有想法。

谢谢!

1 个答案:

答案 0 :(得分:2)

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

  1. 对于.NET 4.5 beta,您可以使用此Caller Information
  2. 您可以使用动态代理。日志记录方法仍然需要一个参数,但动态代理只允许您调用一次,并将其动态添加到您的方法中。您可以使用ContextBoundObjectCastle Dynamic Proxy
  3. 您可以使用AOP框架。这允许你做类似于(2)的事情,但它更整洁。基本上,根据框架,可以在构建时静态而不是动态地添加调用。这是一个很好的AOP框架:PostSharp
  4. 我有一次这样做,我手动添加了电话。我认为一开始会让人望而生畏,但就我而言,情况并非如此糟糕。我有一组非常有限的记录方法(与COM沟通的方法)。