可以通过A类的Log方法来了解谁调用它?
class A
{
public void Log(string msg)
{
Log.Write("method_name: " + msg);
}
}
Run Code Online (Sandbox Code Playgroud)
我想知道类的名称和方法的名称.
您可以使用StackTrace和StackFrame类。您可以通过调用构造函数来获取整个堆栈跟踪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().
(正如评论中提到的,这也会对性能造成影响。您应该对其进行测量,看看它在您的特定情况下是否可以接受。)