如何通过辅助方法打印当前正在执行的方法名称?

时间:2017-01-24 13:15:58

标签: c# .net system.diagnostics

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,这不是我想要的。如何通过辅助方法打印当前正在执行的方法名称?

4 个答案:

答案 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中,它变得更加容易。

CallerMemberNameAttribute