Как получить имя текущего метода из кода

Я знаю, что вы можете сделать

this.GetType().FullName

Редактировать любезно предоставлено @Pasi Savolainen

Чтобы получить

My.Current.Class

Но что я могу вызвать, чтобы получить

My.Current.Class.CurrentMethod

Ответ 1

StackTrace st = new StackTrace ();
StackFrame sf = st.GetFrame (0);

MethodBase currentMethodName = sf.GetMethod ();

Или, если вы хотите иметь вспомогательный метод:

[MethodImpl(MethodImplOptions.NoInlining)]
public string GetCurrentMethod ()
{
    StackTrace st = new StackTrace ();
    StackFrame sf = st.GetFrame (1);

    return sf.GetMethod().Name;
}

Обновлен с помощью кредитов для @stusmith.

Ответ 2

Вызвать System.Reflection.MethodBase.GetCurrentMethod().Name из метода.

Ответ 3

Отражение имеет умение скрывать лес за деревьями. У вас никогда не будет проблемы с точным и быстрым получением текущего имени метода:

void MyMethod() {
  string currentMethodName = "MyMethod";
  //etc...
}

Хотя инструмент рефакторинга, вероятно, не будет исправлять его автоматически.

Если вам полностью не нужна (значительная) стоимость использования Reflection, то этот вспомогательный метод должен быть полезен:

using System.Diagnostics;
using System.Runtime.CompilerServices;
using System.Reflection;
//...

[MethodImpl(MethodImplOptions.NoInlining)]
public static string GetMyMethodName() {
  var st = new StackTrace(new StackFrame(1));
  return st.GetFrame(0).GetMethod().Name;
} 

Обновление: С# версия 5 и .NET 4.5 имеют золотое решение этой общей потребности, вы можете использовать атрибут

Ответ 4

Я думаю, что лучший способ получить полное имя:

 this.GetType().FullName + "." + System.Reflection.MethodBase.GetCurrentMethod().Name;

или попробуйте это

string method = string.Format("{0}.{1}", MethodBase.GetCurrentMethod().DeclaringType.FullName, MethodBase.GetCurrentMethod().Name);   

Ответ 5

Вы также можете использовать MethodBase.GetCurrentMethod(), который запретит компилятору JIT встраивать метод, в котором он использовался.


Update:

Этот метод содержит специальное перечисление StackCrawlMark, которое из моего понимания укажет компилятору JIT, что текущий метод не должен быть встроен.

Это моя интерпретация комментария, связанного с этим перечислением, присутствующим в SSCLI. Комментарий следует:

// declaring a local var of this enum type and passing it by ref into a function 
// that needs to do a stack crawl will both prevent inlining of the calle and 
// pass an ESP point to stack crawl to
// 
// Declaring these in EH clauses is illegal; 
// they must declared in the main method body

Ответ 7

Ну System.Reflection.MethodBase.GetCurrentMethod().Name не очень хороший выбор, потому что он просто отобразит имя метода без дополнительной информации.

Как и для string MyMethod(string str), указанное свойство вернет только MyMethod, что вряд ли возможно.

Лучше использовать System.Reflection.MethodBase.GetCurrentMethod().ToString(), который вернет всю подпись метода...