【问题标题】:How do I get the name of parent method/class/file name inside other method call?如何在其他方法调用中获取父方法/类/文件名的名称?
【发布时间】:2011-01-17 10:51:52
【问题描述】:

我会尽量解释我需要什么。

假设我有这样的课程:

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)调用我的方法或类或文件及其行是:Second

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

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

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

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

有人可以帮帮我吗?

【问题讨论】:

  • 您能否修复问题中的代码部分,使其显示为代码?谢谢

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


【解决方案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 文件的调试版本。

【讨论】:

  • 另外,为了获得他请求的所有信息,它需要是一个带有 PDB 文件的调试版本。
【解决方案2】:

您正在寻找 StackTrace 类。

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

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

【讨论】:

    【解决方案3】:

    StackTrace 类可能能够为您提供所需的信息。

    目前正在考虑为 VB 11 提供一种更简单的方法来访问此信息:Lucian's VBlog: Power6: CALLER_MEMBER

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 是的,我考虑过 StackTrace 类,但我不知道应该使用哪个框架?问题是我得到的名字是:_Lambda$__1 :(
      • 0 : _Info 1 : _Lambda$__1 2 : ThreadStart_Context 3 : runTryCode 4 : ExecuteCodeWithGuaranteedCleanup 5 : RunInternal 6 : Run 7 : ThreadStart 我已经列出了所有堆栈帧并且没有调用第二个。 :( 我的意思是在同一个类中有直接方法,但没有指向另一个方法。:( 有没有人会帮助我?
      猜你喜欢
      • 2012-10-25
      • 2013-07-07
      • 2014-07-11
      • 2011-07-03
      • 1970-01-01
      • 2014-01-09
      • 2012-03-27
      • 1970-01-01
      • 2011-10-27
      相关资源
      最近更新 更多