在VB.NET中是否可能获取引用方法?

8

请看这个例子:

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

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

    Console.WriteLine(entry)

End Sub

我能在LogInfo中获取名称为“Something”的内容吗?

很抱歉这篇文章比较简短,我不确定如何清晰地表达我的问题。如果需要,我会进行澄清和详细解释。

4个回答

12

(编辑:去掉了不必要的使用StackTrace本身的部分,如果您想打印比一个帧更多的信息,它将非常有用。)

您可以使用StackFrame类,但它相当昂贵(如果我没记错的话),并且由于内联而可能稍微不正确。

编辑:像这样:(NoInlining是为了确保其行为正常...)

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

6

请查看如何找到调用当前方法的方法?

翻译成VB(希望如此):

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

''// get calling method name
Console.WriteLine(stackTrace.GetFrame(1).GetMethod().Name)

谢谢,那正是我所需要的。不知道为什么那篇帖子没有出现在我的搜索结果中... - Anders
我之所以能找到它,仅仅是因为我以前见过它,我不得不搜索 StackTrace 和 GetFrame 才使其出现。我建议你采纳Jon的建议,确保获取正确的 frame,他是 .NET 专家(在我看来)。 - Quintin Robinson
你可以做得比这更好 - 可以只创建所需的确切堆栈帧实例,而无需克隆整个堆栈。 - Joel Coehoorn
我同意Joel的观点,我只是从我参考的帖子中复制/翻译了代码。 - Quintin Robinson
请注意,如果您不需要文件名,可以使用重载来表示,这可能更便宜。 (我猜它不需要访问PDB文件。)请参阅我的答案以获取示例。 - Jon Skeet

1

System.Reflection.MethodBase.GetCurrentMethod.Name 做的事情相同,看起来更容易掌握


1
你可以使用StackFrame或StackTrace。但是,由于内联的原因,在发布版和调试器中运行时,你的行为可能会有所不同。因此,你得到的结果可能不是你期望的:
c#:
System.Diagnostics.StackFrame sf = new StackFrame(1);
sf.GetMethod().Name;

VB:

Dim sf as new StackFrame(1)
sf.GetMethod().Name

编辑

抱歉,刚才才意识到您要求使用vb.net。我已经编辑了我的回复,但是vb语法可能不正确。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接