C# 如何确定调用方法和类名?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/14849367/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-10 13:13:03  来源:igfitidea点击:

How to determine calling method and class name?

c#.netloggingreflection.net-assembly

提问by Neurodefekt

I'm currently developing a application logging library using the built in TraceListener. This library will be used in many projects and should offer a simple interface where I only have to care about WHAT is going to be written in into the log file, but not HOW.

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

By using the reflection namespace, I can figure out which application currently called a log function (retrieving execution assembly name), but I want also the name of the function and class that called the logging function.

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

Let's say I have:

假设我有:

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

When I call from another project (class: TestClass, method: TestMethod)

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

Tracer.LogInfo("log this!")

I expect to see in the log:

我希望在日志中看到:

TestClass, TestMethod, log this!

But instead I got

但是我得到了

TracerClass, LogInfo, log this!

How to get the parent method and class name?

如何获取父方法和类名?

回答by Jens Kloster

Try doing something like this:

尝试做这样的事情:

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

There are more elegant solutions in C# 5.0 >, however if you are using older frameworks, the above will help.

C# 5.0 > 中有更优雅的解决方案,但是如果您使用的是较旧的框架,以上内容会有所帮助。

回答by daryal

You may just record the full stack trace instead of just the calling method using Environment.StackTrace. This may help you if you want to use the same logging structure to log exceptions.

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

Refer to this msdn pagefor more information.

有关更多信息,请参阅此 msdn 页面