【问题标题】:Safe way of finding the calling method and class [duplicate]查找调用方法和类的安全方法[重复]
【发布时间】:2012-06-04 21:36:51
【问题描述】:

可能重复:
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);

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

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

谢谢!

【问题讨论】:

  • 栈帧是如何依赖多线程的?那没有任何意义。您确定您没有看到由于 jit 优化而导致的差异吗?如果这是可疑堆栈帧的原因,您将不得不进行一些巧妙的解析。
  • StackFramesToSkip 是否始终对上下文有效?您的线程问题可能存在吗?
  • 直到C# 5 comes along,我认为您将不得不接受将名称作为参数传递。无论您是手动执行此操作还是使用某种构建后调用站点重写来为您执行此操作(不确定 PostSharp 是否可以做到,但如果没有,我会感到惊讶)主要是耐心和预算的问题:P
  • 是的,看起来是重复的。我确实搜索过类似的,但显然我没有确定关键字。对不起。
  • @ChristopherCurrens:我不太确定,对我来说也没有意义。但现在我看到一个案例,报告的调用方法是StackBuilderSink._PrivateProcessMessage,以及其他一些正确的案例。

标签: c# .net reflection


【解决方案1】:

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

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

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

【讨论】:

  • 如果我错了,请纠正我,但这不会让我获得 Log 类中的执行方法吗?我正在寻找的是发出调用的方法,而不是将其作为参数传递。
  • 哦,对不起,我看错了。这对你没有帮助。我会建议其他的。
  • 好了,我添加了不同的答案。
  • 太棒了,谢谢!我想我会选择 PostSharp。在我正在进行的项目的这个阶段感觉有点矫枉过正,但如果时间允许,绝对值得一看。
  • 我很高兴。 PostSharp 非常好。它应该内置在 C# 中。作为一个框架,它也非常精致和干净。不过要小心,一开始你可能会喝醉并开始用它做各种各样的事情:P
猜你喜欢
  • 2018-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多