如何在其他方法调用中获取父方法/类/文件名的名称?

时间:2010-02-16 15:28:35

标签: .net vb.net .net-3.5

我会尝试解释我需要的东西。

假设我有一个这样的课程:

Public Class Example1

    Public Sub ToBeCalled()

        System.Console.WriteLine(
            "The Method or Class or file and its line which called me is: ",
            ?????)

    End Sub

End Class

然后我有这样的第二堂课:

Public Class Second

    Public Sub SomeProcedure()

        Dim obj As Example1 = New Example1

        obj.ToBeCalled()

    End Sub

End Class

Module1
    Dim obj2 As Second = New Second()

    obj2.SomeProcedure()

End Module1

我想在屏幕上取代“????”是:

1)调用我的方法或类或文件及其行是:第二个

2)调用我的方法或类或文件及其行是:SomeProcerure

3)......是:Second.vb

4)......是:第54行

5).......是:col 33

有人可以帮帮我吗?

4 个答案:

答案 0 :(得分:1)

您始终可以使用StackTrace class。这将允许您遍历堆栈以查找有关导致调用方法的方法的信息。

在您的情况下,您将需要使用StackFrame class,因为您只需要一个特定帧(您可以使用StackTrace类,但它会执行整个跟踪,并且在这种情况下,你只需要一个框架)。使用StackTrace实例,您可以调用GetMethod method来获取代表正在进行调用的方法的MethodBase实例。

这是一个例子,它在C#中,但很容易翻译成VB.NET:

// Skip the current stack frame, get the caller.
StackFrame stackFrame = new StackFrame(1);

// Print out the method name.
Console.WriteLine(stackFrame.GetMethod().Name);

请注意,如果您想要线号等附加信息,则必须使用PDB文件提供调试版本。

答案 1 :(得分:0)

您正在寻找StackTrace课程。

请注意,您只能使用PDB文件在调试版本中获取行号。

另请注意,您应在方法之前添加<MethodImpl(MethodImplOptions.NoInlining)> _

答案 2 :(得分:0)

为了获得调用者(也是列号和行号),您应该使用System.Diagnostics.StackTrace类。

 StackTrace stackTrace = new StackTrace();
 StackFrame stackFrame = stackTrace.GetFrame(1);
 MethodBase methodBase = stackFrame.GetMethod();

答案 3 :(得分:0)

StackTrace课程可能会为您提供所需的信息。

目前正在考虑使用更简单的方法来访问此信息,因为VB 11:Lucian's VBlog: Power6: CALLER_MEMBER