这是一个愚蠢的问题,但是有可能从该方法中获取当前正在执行的方法的名称吗?
Public Sub SomeMethod()
Dim methodName as String = System.Reflection.[function to get the current method name here?]
End Sub
由于
答案 0 :(得分:117)
答案 1 :(得分:37)
其他方法与所询问的方法很接近,但它们不返回字符串值。但这样做:
Dim methodName$ = System.Reflection.MethodBase.GetCurrentMethod().Name
答案 2 :(得分:5)
为了保证在运行时向此问题提供的任何答案实际上都有效(System.Reflection.MethodBase.GetCurrentMethod().Name
),您需要添加一个属性。我知道没有编译器/运行时标志可以破坏这种方法:
您尝试获取must be marked
名称的功能[<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)]
此外,现在VB中有nameof()
运算符,C#(and maybe F# soon)
对于你的情况,nameof(SomeMethod)
(我相信VB和C#的语法相同)
答案 3 :(得分:4)
另一种方法是使用System.Runtime.Compiler Services命名空间中的CallerMemberNameAttribute来填充可选参数。例如......
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 :(得分:1)
Dim methodName As String = System.Reflection.MethodBase.GetCurrentMethod().Name