这是一个愚蠢的问题,但是是否有可能从该方法中获取当前正在执行的方法的名称?
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
谢谢
Answers:
为了确保针对此问题的任何答案System.Reflection.MethodBase.GetCurrentMethod().Name
在运行时()都能正常工作,您需要添加一个属性。我知道没有编译器/运行时标志会破坏此方法:
您要获取名称的功能必须标记
[<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#的语法将相同)
另一种方法是使用System.Runtime.CompilerServices名称空间中的CallerMemberName属性来填充可选参数。例如 ...
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文档。