获取当前方法的名称


70

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

Public Sub SomeMethod()

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

End Sub

谢谢



实际上,这就是获取调用方法名称的方法,而不是当前正在执行的方法的名称。不过还是很酷!
马克·布林格

Answers:


128

11
最好使用基类:System.Reflection.MethodBase.GetCurrentMethod();
marstone 2014年

1
@marstone-您能解释一下为什么吗?
加文·沃德

5
@PunkyGuy有人说:“尽管这两个调用具有完全相同的效果,但是在实际定义它们的类的子类上调用Shared函数通常是个坏主意”。参考:bytes.com/topic/visual-basic-net/answers/…– marstone 2014
6

这在优化情况下并不总是有效。有时,当前方法已被优化。
马斯洛

42

其他方法与要求的方法很接近,但是它们不返回字符串值。但这确实是:

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

6

为了确保针对此问题的任何答案System.Reflection.MethodBase.GetCurrentMethod().Name在运行时()都能正常工作,您需要添加一个属性。我知道没有编译器/运行时标志会破坏此方法:

您要获取名称的功能必须标记

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

另外,如今,nameof()VB中有运算符,C#(可能不久后还有F#),对于您而言,这是运算符nameof(SomeMethod)(我相信这里的VB和C#的语法将相同)


5

另一种方法是使用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文档。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.