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



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



Public Sub SomeMethod()

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

End Sub


спасибо

660   5  

5 ответов:

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

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

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

другой подход будет использовать CallerMemberNameAttribute из системы.​Во время выполнения.​Пространство имен CompilerServices для заполнения необязательного параметра. Например...

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 документации для образца кода.

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

Comments

    Ничего не найдено.