如何获得调用方法的名称?

nik*_*nik 5 .net

可以通过A类的Log方法来了解谁调用它?

class A
{
    public void Log(string msg)
    {
        Log.Write("method_name: " + msg);
    }
}
Run Code Online (Sandbox Code Playgroud)

我想知道类的名称和方法的名称.

Jon*_*eet 4

您可以使用StackTraceStackFrame类。您可以通过调用构造函数来获取整个堆栈跟踪StrackTrace,也可以使用StackFrame构造函数获取要跳过的帧数的特定堆栈帧。

您应该意识到,由于内联,它可能不准确。(例如,方法 A 内联调用您的方法的方法 B - 将报告方法 A,而不是 B)。

示例代码:

using System;
using System.Diagnostics;

class Test
{
    static void ShowCaller()
    {
        // Use this code if you want multiple frames
        // StackTrace trace = new StackTrace();
        // StackFrame frame = trace.GetFrame(1);

        // Use this code if you're only interested in one frame
        StackFrame frame = new StackFrame(1);
        Console.WriteLine(frame.GetMethod());
    }

    static void Intermediate()
    {
        ShowCaller();
    }

    static void Main()
    {
        Intermediate();
    }
}
Run Code Online (Sandbox Code Playgroud)

作为优化的发布版本运行,这将打印Void Main()- 当运行调试版本时,或者如果您将更多代码放入Intermediate()方法中,它将打印Void Intermediate().

(正如评论中提到的,这也会对性能造成影响。您应该对其进行测量,看看它在您的特定情况下是否可以接受。)