获取当前方法的名称

时间:2010-01-12 18:09:23

标签: .net vb.net reflection

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

Public Sub SomeMethod()

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

End Sub

由于

5 个答案:

答案 0 :(得分:117)

答案 1 :(得分:37)

其他方法与所询问的方法很接近,但它们不返回字符串值。但这样做:

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

答案 2 :(得分:5)

为了保证在运行时向此问题提供的任何答案实际上都有效(System.Reflection.MethodBase.GetCurrentMethod().Name),您需要添加一个属性。我知道没有编译器/运行时标志可以破坏这种方法:

您尝试获取must be marked

名称的功能
  • 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中有nameof()运算符,C#(and maybe F# soon) 对于你的情况,nameof(SomeMethod)(我相信VB和C#的语法相同)

答案 3 :(得分:4)

另一种方法是使用System.Runtime.Compiler Services命名空间中的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命名空间中的其他属性可以以类似的方式使用,以检索源文件的完整路径(在编译时)和/或调用的行号。有关示例代码,请参阅CallerMemberNameAttribute文档。

答案 4 :(得分:1)

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