获取当前方法的名称

这是一个愚蠢的问题,但是有可能从该方法中获取当前正在执行的方法的名称?

Public Sub SomeMethod() Dim methodName as String = System.Reflection.[function to get the current method name here?] End Sub 

谢谢

System.Reflection.MethodInfo.GetCurrentMethod();

其他方法接近要求,但不返回string值。 但是这样做:

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

为了保证在这个问题中出现的任何答案在运行时都能正常工作( System.Reflection.MethodBase.GetCurrentMethod().Name ),你需要添加一个属性。 没有编译器/运行时标志,我知道这个打破了这个方法:

你试图得到的名字的function必须被标记

  • 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)]

另外,现在在VB,C#( 也许是F# )中有nameof()运算符,对于你的情况,这将是nameof(SomeMethod) (我相信这里的VB和C#的语法是相同的)

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

另一种方法是使用System.Runtime.CompilerServices命名空间中的Caller Member Name Attribute来填充可选参数。 例如 …

 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名称空间中的其他属性可以以类似的方式使用,以检索源文件的完整path(在编译时)和/或调用的行号。 有关示例代码,请参阅CallerMemberNameAttribute文档。