【发布时间】:2012-06-04 21:36:51
【问题描述】:
我有一个 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