见这个例子:
''//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”吗?
对于这篇文章的简要性感到抱歉,我不确定如何恰当地表达这个问题。我会根据需要澄清和阐述。
答案 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做同样的事情,看起来更容易搞定