Это глупый вопрос, но можно ли получить имя метода, который в настоящее время выполняется из этого метода?
Public Sub SomeMethod()
Dim methodName as String = System.Reflection.[function to get the current method name here?]
End Sub
Спасибо
Это глупый вопрос, но можно ли получить имя метода, который в настоящее время выполняется из этого метода?
Public Sub SomeMethod()
Dim methodName as String = System.Reflection.[function to get the current method name here?]
End Sub
Спасибо
Другие методы близки к тому, что было задано, но они не возвращают строковое значение. Но это делает:
Dim methodName$ = System.Reflection.MethodBase.GetCurrentMethod().Name
Чтобы гарантировать, что любой из ответов, представленных на этот вопрос, действительно работает (System.Reflection.MethodBase.GetCurrentMethod().Name
) во время выполнения, вам нужно добавить атрибут. Нет флагов компилятора/выполнения, о которых я знаю, которые нарушают этот метод:
должна быть отмечена функция, которую вы пытаетесь получить
[<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 и С# здесь)
Другим подходом было бы использовать Атрибут имени вызывающего абонента из пространства 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 для примера кода.
Dim methodName As String = System.Reflection.MethodBase.GetCurrentMethod().Name