Получить имя текущего метода - PullRequest
59 голосов
/ 12 января 2010

Это довольно глупый вопрос, но возможно ли получить имя метода, который в данный момент выполняется из этого метода?

Public Sub SomeMethod()

   Dim methodName as String = System.Reflection.[function to get the current method name here?]

End Sub

Спасибо

Ответы [ 5 ]

118 голосов
/ 12 января 2010
37 голосов
/ 30 января 2015

Другие методы близки к тому, что было задано, но они не возвращают значение string . Но это делает:

Dim methodName$ = System.Reflection.MethodBase.GetCurrentMethod().Name
5 голосов
/ 03 февраля 2017

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

функция, которую вы пытаетесь получить имя должна быть помечена

  • F # [<System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)>]
  • VB: <System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)>

  • C #: [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]

Кроме того, в настоящее время в VB есть оператор nameof(), C # ( и, возможно, F # скоро ) который для вашего случая будет nameof(SomeMethod) (я думаю, что синтаксис будет одинаковым для VB и C # здесь)

4 голосов
/ 04 июня 2017

Другой подход заключается в использовании Атрибут имени участника вызывающего абонента * 1002. * из среды выполнения. Пространство имен служб компилятора для заполнения необязательного параметра. Например ...

Private Function GetMethodName(<System.Runtime.CompilerServices.CallerMemberName>
    Optional memberName As String = Nothing) As String

    Return memberName

End Function

Функция будет вызываться так, как вы ожидаете ...

Public Sub DoSomeWork()
    Dim methodName As String = GetMethodName()
    Console.WriteLine($"Entered {methodName}")

    ' Do some work
End Sub

Вместо того, чтобы «просто» получать имя метода, функция также может использовать имя метода, полученное для дальнейшего упрощения кода. Например ...

Private Sub TraceEnter(
    <System.Runtime.CompilerServices.CallerMemberName>
    Optional memberName As String = Nothing)

    Console.WriteLine($"Entered {memberName}")

End Sub

... который может быть использован следующим образом ...

Public Sub DoSomeWork()
    TraceEnter()

    ' Do some work

End Sub

Другие атрибуты в пространстве имен CompilerServices могут использоваться аналогичным образом для получения полного пути (во время компиляции) исходного файла и / или номера строки вызова. См. Документацию CallerMemberNameAttribute для примера кода.

1 голос
/ 07 декабря 2016
Dim methodName As String = System.Reflection.MethodBase.GetCurrentMethod().Name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...