Подтвердить что ты не робот

Получить имя текущего метода

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

Public Sub SomeMethod()

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

End Sub

Спасибо

4b9b3361

Ответ 2

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

Dim methodName$ = System.Reflection.MethodBase.GetCurrentMethod().Name

Ответ 3

Чтобы гарантировать, что любой из ответов, представленных на этот вопрос, действительно работает (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)>

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

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

Ответ 4

Другим подходом было бы использовать Атрибут имени вызывающего абонента из пространства System.Runtime. необязательный параметр. Например...

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 для примера кода.

Ответ 5

Dim methodName As String = System.Reflection.MethodBase.GetCurrentMethod().Name