如何确定调用方法和类名?涉及IT技术相关内容。

42

我目前正在使用内置的TraceListener开发应用程序日志记录库。这个库将被用于很多项目中,应该提供一个简单的接口,我只需要关心写入日志文件的内容是什么,而不是如何写。

通过使用反射命名空间,我可以找出调用日志函数的应用程序(检索执行程序集名称),但我也想知道调用日志函数的函数和类的名称。

假设我有:

public static void LogInfo(string vLogText) {
   Trace.WriteLine(
        MethodInfo.GetCurrentMethod().Name
        + this.GetType().ToString() + vLogText);
   }

当我从另一个项目调用(类:TestClass,方法:TestMethod)时

Tracer.LogInfo("log this!")

我希望在记录中看到:

TestClass, TestMethod, log this!

但是我得到的是

TracerClass, LogInfo, log this!

如何获取父方法和类名?


6
如果你正在使用最新的C#和VS 2012,那么这个链接可能会对你有很大帮助。 - Patryk Ćwiek
@Trustme-I'maDoctor 这太棒了!我不知道有这样的东西。你能否将其转换为答案,而不是评论,以便我可以投票并将其标记为关闭?非常感谢。 - Neurodefekt
@Neurodefekt 没问题,已经完成了。很高兴能帮到你。 :) - Patryk Ćwiek
2个回答

33

试着做这样的事情:

var mth = new StackTrace().GetFrame(1).GetMethod();
var cls = mth.ReflectedType.Name;
// where 1 illustrates how deep into the stack to reflect.

在C# 5.0中有更优雅的解决方案,但如果您使用较旧的框架,则上述方法将有所帮助。


21
两件事情:1)这可能会显著影响性能;2)在优化的代码中,方法内联可能会导致错误的方法名称被打印。 - Mike Zboray
1
如果性能不是问题,您可以使用MethodImpl来强制禁止内联:[MethodImpl(MethodImplOptions.NoInlining)] - Colin Zabransky
1
该行代码 var cls = mth.ReflectedType.Name; 会返回方法类型,包括签名,而不仅仅是调用该方法的实例的类名。我建议使用 var cls = mth.DeclaringType.Name; 来获取类名。 - Domin

3
您可以使用Environment.StackTrace记录完整的堆栈跟踪,而不仅仅是调用方法。如果您想使用相同的日志记录结构记录异常,这可能会有所帮助。
有关更多信息,请参阅此 msdn 页面

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接