2017-01-24 13 views
1

ExecutingMethodName предназначен для печати имени метода вызывающего. Например:Как распечатать имя текущего исполняемого метода с помощью вспомогательного метода?

  • static void Main(string[] args){Auxiliary.ExecutingMethodName();} следует распечатать главную.

  • 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, что не то, что я хочу. Как распечатать текущее имя метода выполнения с помощью вспомогательного метода?

ответ

2

Просто измените 0 на 1 в StackFrame вызова в вашем методе (StackFrame(0) ваша currrent позиция в стеке вызовов, и вы должны идти на один шаг назад):

public static void ExecutingMethodName() 
{ 
    Console.WriteLine(new StackFrame(1).GetMethod().Name); 
} 
2

Используйте код, приведенный ниже. Вы должны использовать StackFrame(1), StackFrame(2) всегда будет ExecutingMethodName, на самом деле вам нужно распечатать вызывающего абонента ExecutingMethodName.

public static void ExecutingMethodName() 
     { 
      Console.WriteLine(new StackFrame(1).GetMethod().Name); 
     } 

Вы можете обратиться StackFrame Constructor (Int32)

В C# 5 стало более легким.

CallerMemberNameAttribute

3

Вы должны пропустить первую запись в кадре стека (который принадлежит ExecutingMethodName):

public static void ExecutingMethodName() 
{ 
    Console.WriteLine(new StackFrame(1).GetMethod().Name); 
} 
3

CallerMemberNameAttribute Используйте вместо этого используя что-то из StackFrame. Гораздо чище.

public static void ExecutingMethodName([CallerMemberName]string callerName= null) 
{ 
    Console.WriteLine(callerName); 
} 
+0

Проголосовали против. Хорошая идея. Какова цель инициализации 'callerName = null'? –

+1

«Вы применяете атрибут CallerMemberName к необязательному параметру, который имеет значение по умолчанию. Вы должны указать явное значение по умолчанию для необязательного параметра. Вы не можете применить этот атрибут к параметрам, которые не указаны как необязательные». из предоставленной ссылки MSDN. –