Я знаю, что ты можешь сделать
this.GetType().FullName
Получить
My.Current.Class
Но что я могу позвонить, чтобы получить
My.Current.Class.CurrentMethod
Я знаю, что ты можешь сделать
this.GetType().FullName
Получить
My.Current.Class
Но что я могу позвонить, чтобы получить
My.Current.Class.CurrentMethod
using System.Diagnostics;
...
var st = new StackTrace();
var sf = st.GetFrame(0);
var currentMethodName = sf.GetMethod();
Или, если вы хотите иметь вспомогательный метод:
[MethodImpl(MethodImplOptions.NoInlining)]
public string GetCurrentMethod()
{
var st = new StackTrace();
var sf = st.GetFrame(1);
return sf.GetMethod().Name;
}
Обновлено с благодарностью за @stusmith.
MethodImpl(MethodImplOptions.NoInlining)
к GetCurrentMethod
только предотвращает встраивание этого метода в его вызывающий объект. Это не препятствует тому, чтобы сам вызывающий метод был встроен в его собственный вызывающий объект и т. Д. И т. Д.
- person LukeH; 16.04.2010
sf.GetMethod()
не является строкой.
- person Hamish Grubijan; 03.05.2012
GetFrame(1)
)
- person Jonathon Reinhart; 07.08.2012
return sf.GetMethod().Name
. Как указано выше @LukeH, если вы хотите, чтобы это было пуленепробиваемым, я подозреваю, вам также необходимо пометить любой метод, который вызывает его, с помощью MethodImpl(MethodImplOptions.NoInlining)
(если вы не уверены, что он не будет встроен (например, метод, представленный как public
)
- person rkagerer; 16.01.2013
[MethodImpl(...NoInlining)]
не имеет ' t всегда работает, если компилятор оптимизирует StackTrace.
- person drzaus; 23.01.2014
[MethodImpl(MethodImplOptions.NoInlining)]
, кажется, работает хорошо, но когда я перехожу в режим выпуска, все ставки кажутся отключенными, и NoInlining
, кажется, рассматривается как подсказка?
- person snowcode; 05.11.2014
NoInlining
на всех вызывающих абонентов на всем пути вверх по дереву. Дох! (конечно!) Это раздражает, поскольку большинство случаев использования, в которых мне нужно GetMethod()
, - это помощники при приемке, и требование, чтобы все вызывающие абоненты имели NoInlining
, код становится беспорядочным и трудным для сканирования. В любом случае, комментарий моих коллег объяснил, почему мой код иногда был встроен, несмотря на то, что метод отмечен атрибутом. Я не удалял свой комментарий выше, на случай, если у кого-то такая же проблема.
- person snowcode; 05.11.2014
nameof()
, которую также можно использовать для этой цели: nameof(this.YourCurrentMethod);
https://msdn.microsoft.com/en-us/library/dn986596.aspx
- person Fabio; 06.02.2016
new StackFrame().GetMethod()
, он короче new StackTrace().GetFrame(0).GetMethod()
и делает то же самое.
- person Jason C; 25.05.2021
Вызов System.Reflection.MethodBase.GetCurrentMethod().Name
из метода.
StackTrace
дает значительно более медленные результаты. Единственный сценарий, в котором это дает более быстрые результаты, - это когда отражение не сравнивается ни с чем. Используя BenchmarkDotNet, я протестировал MethodBase.GetCurrentMethod().Name
против new StackFrame(0).GetMethod().Name
, где отражение использовалось в среднем 1,5 мкс, а StackTrace
использовало 11,5 мкс.
- person 404; 21.01.2019
Начиная с C # версии 6, вы можете просто позвонить:
string currentMethodName = nameof(MyMethod);
В C # версии 5 и .NET 4.5 вы можете использовать [ CallerMemberName], чтобы компилятор автоматически генерировал имя вызывающего метода в строковом аргументе. Другие полезные атрибуты: [CallerFilePath], чтобы компилятор сгенерировал путь к файлу исходного кода, и [CallerLineNumber], чтобы получить номер строки в файле исходного кода для оператора, сделавшего вызов.
До этого были еще несколько запутанных способов получить имя метода, но намного проще:
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;
}
nameof()
, которую также можно использовать для этой цели: nameof(this.YourCurrentMethod);
https://msdn.microsoft.com/en-us/library/dn986596.aspx
- person Fabio; 06.02.2016
CallerMemberName
работает для .NETCore 2.0 в методах Async. Идеально.
- person Andy; 22.04.2018
Я думаю, что лучший способ получить полное имя:
this.GetType().FullName + "." + System.Reflection.MethodBase.GetCurrentMethod().Name;
или попробуйте это
string method = string.Format("{0}.{1}", MethodBase.GetCurrentMethod().DeclaringType.FullName, MethodBase.GetCurrentMethod().Name);
async
методов. Я вызываю System.Reflection.MethodBase.GetCurrentMethod().Name
в первой строке метода и получаю MoveNext
.
- person Gusdor; 23.06.2016
async
я добавил ответ здесь stackoverflow.com/questions/44153/
- person Useme Alehosaini; 03.05.2021
Это не работает?
System.Reflection.MethodBase.GetCurrentMethod()
Возвращает объект MethodBase, представляющий текущий выполняющийся метод.
Пространство имен: System.Reflection
Сборка: mscorlib (в mscorlib.dll)
http://msdn.microsoft.com/en-us/library/system.reflection.methodbase.getcurrentmethod.aspx
async
методов
- person Devnsyde; 14.05.2020
async
методов, пожалуйста, посетите мой ответ в stackoverflow.com/questions/44153/
- person Useme Alehosaini; 03.05.2021
Вы также можете использовать MethodBase.GetCurrentMethod()
, что запретит компилятору JIT встраивать метод, в котором он используется.
Обновление:
Этот метод содержит специальное перечисление 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
GetCurrentMethod
запрещает JIT встраивать вызывающий метод?
- person LukeH; 16.04.2010
StackCrawlMark
, или вызывающего его метода.
- person LukeH; 16.04.2010
GetCurrentMethod
украшен [MethodImpl(MethodImplOptions.NoInlining)]
, я считаю, что это вызывающий метод, содержащий перечисление.
- person João Angelo; 16.04.2010
Что ж, System.Reflection.MethodBase.GetCurrentMethod().Name
- не очень хороший выбор, потому что он просто отображает имя метода без дополнительной информации.
Как и для string MyMethod(string str)
, указанное выше свойство вернет только MyMethod
, что вряд ли достаточно.
Лучше использовать System.Reflection.MethodBase.GetCurrentMethod().ToString()
, который вернет всю подпись метода ...
this.ToString()
дает вам текущее имя класса только в том случае, если вы не сделали ничего особенного в своем собственномpublic override string ToString()
.GetType().FullName
всегда дает вам полное имя. - person Pasi Savolainen   schedule 16.04.2010