ExecutingMethodName
用于打印调用者的方法名称。例如:
static void Main(string[] args){Auxiliary.ExecutingMethodName();}
应该打印Main。
static void Foo(){Auxiliary.ExecutingMethodName();}
应该打印Foo。
static class Auxiliary
{
public static void ExecutingMethodName()
{
Console.WriteLine(new StackFrame(0).GetMethod().Name);
}
}
class Program
{
static void Main(string[] args)
{
Auxiliary.ExecutingMethodName();// should print Main
}
static void Foo()
{
Auxiliary.ExecutingMethodName();// should print Foo
}
}
上面的当前实现总是打印ExecutingMethodName
,这不是我想要的。如何通过辅助方法打印当前正在执行的方法名称?
答案 0 :(得分:3)
您必须跳过堆栈框架中的第一个条目(属于ExecutingMethodName
):
public static void ExecutingMethodName()
{
Console.WriteLine(new StackFrame(1).GetMethod().Name);
}
答案 1 :(得分:3)
使用CallerMemberNameAttribute代替堆栈框架中的内容。更清洁的方式。
public static void ExecutingMethodName([CallerMemberName]string callerName= null)
{
Console.WriteLine(callerName);
}
答案 2 :(得分:2)
在你的方法中只需在stackframe调用中将0更改为1(StackFrame(0)
是你在调用堆栈中的好位置,你需要退后一步):
public static void ExecutingMethodName()
{
Console.WriteLine(new StackFrame(1).GetMethod().Name);
}
答案 3 :(得分:2)
使用以下代码。您必须使用StackFrame(1)
,StackFrame(2)
始终为ExecutingMethodName
,实际上您必须打印ExecutingMethodName
的来电者。
public static void ExecutingMethodName()
{
Console.WriteLine(new StackFrame(1).GetMethod().Name);
}
您可以参考StackFrame Constructor (Int32)
在C#5中,它变得更加容易。