可以在VB.NET中获取引用方法吗?

可以在VB.NET中获取引用方法吗?,vb.net,Vb.net,请参见此示例: ''//file1.vb Sub Something() ''//... Functions.LogInfo("some text") ''//... End Sub ''//functions.vb Sub LogInfo(ByVal entry as String) Console.WriteLine(entry) End Sub 我可以在LogInfo中获取“某物”的名称吗 对不起,这篇文章很简短,我不知道如何正确地表达这个问题。我将

请参见此示例:

''//file1.vb
Sub Something()
    ''//...
    Functions.LogInfo("some text")
    ''//...
End Sub

''//functions.vb
Sub LogInfo(ByVal entry as String)

    Console.WriteLine(entry)

End Sub
我可以在LogInfo中获取“某物”的名称吗

对不起,这篇文章很简短,我不知道如何正确地表达这个问题。我将根据需要进行澄清和详细说明。

(编辑:删除不必要的自我使用-如果您想打印更多信息而不仅仅是一个框架,这将非常有用。)

您可以使用这个类,但是它非常昂贵(IIRC),并且由于内联的原因可能会有点不正确

编辑:类似这样的内容:(noinline是为了确保它的行为正常…)

导入系统诊断
导入System.Runtime.CompilerServices
公开课考试
共享子主目录()
某物
端接头
_
共享子对象()
Functions.LogInfo(“一些文本”)
端接头
末级
公共类功能
_
公共共享子LogInfo(ByVal条目作为字符串)
作为堆栈帧的尺寸帧=新堆栈帧(1,错误)
Console.WriteLine(“{0}:{1}”_
frame.GetMethod.Name_
条目)
端接头
末级
看一看

翻译成VB(希望如此):


您可以使用StackFrame或StackTrace。但是,由于内联,您在发布版本中的行为可能与在调试器中运行的行为不同。因此,您的结果可能不是您所期望的:

c#:

vb:

编辑
很抱歉,你刚意识到你要的是vb.net。我编辑了我的回答,但vb语法可能不正确

System.Reflection.MethodBase.GetCurrentMethod.Name也做了同样的事情,而且似乎更容易掌握

的窍门,谢谢你按照我的需要解决了这个问题。我想知道为什么那篇文章没有出现在我的搜索中……我能找到它的唯一原因是因为我以前见过它,我必须搜索StackTrace和GetFrame才能让它出现。我建议您采纳Jon的建议,确保获得正确的框架,他是IMO的.NET专家。您可以做得更好-可能只需要创建所需的确切堆栈框架的实例,而不是克隆整个堆栈。我同意Joel,我只是从我引用的文章中复制/翻译了代码。请注意,如果您不需要文件名,可以使用重载来表示,这可能会更便宜。(我猜它不需要点击PDB文件。)请参阅我的答案以获取示例。
Imports System.Diagnostics
Imports System.Runtime.CompilerServices

Public Class Test

    Shared Sub Main()
        Something()
    End Sub        

    <MethodImpl(MethodImplOptions.NoInlining)> _
    Shared Sub Something()        
        Functions.LogInfo("some text")
    End Sub

End Class

Public Class Functions

    <MethodImpl(MethodImplOptions.NoInlining)> _
    Public Shared Sub LogInfo (ByVal entry as String)
        Dim frame as StackFrame = new StackFrame(1, False)
        Console.WriteLine("{0}: {1}", _
                          frame.GetMethod.Name, _
                          entry)
    End Sub

End Class
Imports System.Diagnostics
''// get call stack
Dim stackTrace As New StackTrace()

''// get calling method name
Console.WriteLine(stackTrace.GetFrame(1).GetMethod().Name)
System.Diagnostics.StackFrame sf = new StackFrame(1);
sf.GetMethod().Name;
Dim sf as new StackFrame(1)
sf.GetMethod().Name