如何确定调用方法和类名? [复制]

Posted

技术标签:

【中文标题】如何确定调用方法和类名? [复制]【英文标题】:How to determine calling method and class name? [duplicate] 【发布时间】:2013-01-28 18:03:00 【问题描述】:

我目前正在使用内置的 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!

如何获取父方法和类名?

【问题讨论】:

This might help you immensely 如果您使用的是最新的 C# 和 VS 2012。 @Trustme-I'maDoctor 这太棒了!不知道有这样的事情。您能否将其作为答案而不是评论,以便我投票并将其标记为已关闭?非常感谢。 @Neurodefekt 没问题,已经完成了。很高兴我能帮助你。 :) 【参考方案1】:

尝试做这样的事情:

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 中有更优雅的解决方案>,但是如果您使用的是较旧的框架,以上内容会有所帮助。

【讨论】:

两件事:1) 这会显着影响性能 2) 在优化的代码中,方法内联会导致打印不正确的方法名称。 如果性能不是问题,您可以使用 MethodImpl 强制不进行内联:[MethodImpl(MethodImplOptions.NoInlining)] var cls = mth.ReflectedType.Name; 行生成包括签名的方法类型,而不仅仅是调用该方法的实例的类名。我建议类名var cls = mth.DeclaringType.Name;【参考方案2】:

您可以只记录完整的堆栈跟踪,而不仅仅是使用Environment.StackTrace 的调用方法。如果您想使用相同的日志记录结构来记录异常,这可能会对您有所帮助。

请参阅this msdn page 了解更多信息。

【讨论】:

以上是关于如何确定调用方法和类名? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

c#如何创建类 调用

不同程序集,名称空间类名和方法签名都一样的方法,如何调用

在android中调用方法详细信息,例如行号,方法名称和类名称[重复]

如果类名作为字符串传递,如何动态调用类的方法

如何在Android平台上使用JS直接调用Java方法

如何将具体的类名作为字符串获取? [复制]