Как получить имя текущего метода из кода
Я знаю, что вы можете сделать
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
Ответ 6
Не работает ли это?
System.Reflection.MethodBase.GetCurrentMethod()
Возвращает объект MethodBase, представляющий текущий исполняемый метод.
Пространство имен: System.Reflection
Сборка: mscorlib (в mscorlib.dll)
http://msdn.microsoft.com/en-us/library/system.reflection.methodbase.getcurrentmethod.aspx
Ответ 7
Ну System.Reflection.MethodBase.GetCurrentMethod().Name
не очень хороший выбор, потому что он просто отобразит имя метода без дополнительной информации.
Как и для string MyMethod(string str)
, указанное свойство вернет только MyMethod
, что вряд ли возможно.
Лучше использовать System.Reflection.MethodBase.GetCurrentMethod().ToString()
, который вернет всю подпись метода...
Ответ 8
Проверьте это: http://www.codeproject.com/KB/dotnet/MethodName.aspx