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

时间:2009-04-03 19:01:37

标签: 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中获得名称“Something”吗?

对于这篇文章的简要性感到抱歉,我不确定如何恰当地表达这个问题。我会根据需要澄清和阐述。

4 个答案:

答案 0 :(得分:12)

(编辑:删除了对StackTrace本身不必要的使用 - 如果你想要打印的信息不仅仅是一帧,这将非常有用。)

您可以使用StackFrame类,但它非常昂贵(IIRC),并且由于内联可能会略微不正确。

编辑:这样的事情:( 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

答案 1 :(得分:6)

看看How can I find the method that called the current method?

转换为VB(希望):

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

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

答案 2 :(得分: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语法可能不正确

答案 3 :(得分:1)

System.Reflection.MethodBase.GetCurrentMethod.Name做同样的事情,看起来更容易搞定