Получите название существующего метода

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

Public Sub SomeMethod()

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

End Sub

Спасибо

62
задан 12 January 2010 в 21:20

4 ответа

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

Dim methodName$ = System.Reflection.MethodBase.GetCurrentMethod().Name
38
ответ дан 31 October 2019 в 13:25

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

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

5
ответ дан 31 October 2019 в 13:25

Другой подход должен был бы использовать Caller†"MemberвЂ" Name†‹Атрибут от Системы. ​ Время выполнения. †‹Compiler​ Сервисное пространство имен для заполнения дополнительного параметра. Например...

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

4
ответ дан 31 October 2019 в 13:25
Dim methodName As String = System.Reflection.MethodBase.GetCurrentMethod().Name
1
ответ дан 31 October 2019 в 13:25

Другие вопросы по тегам:

Похожие вопросы: