代码之家  ›  专栏  ›  技术社区  ›  Anders

是否可以在vb.net中获取引用方法?

  •  8
  • Anders  · 技术社区  · 16 年前

    请参见此示例:

    ''//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 回复  |  直到 16 年前
        1
  •  12
  •   Jon Skeet    16 年前

    (编辑:删除了不必要的 StackTrace 它本身——如果你想打印出更多的信息而不仅仅是一帧,那么它会很有用。)

    你可以使用 StackFrame 类,但它相当昂贵(IIRC),可能由于内联而稍有错误。

    编辑:类似这样的事情:(噪声是为了确保它的行为正常…)

    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
    
        2
  •  6
  •   Community CDub    8 年前

    看一看 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)
    
        3
  •  1
  •   JoshBerke    16 年前

    您可以使用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语法可能不对

        4
  •  1
  •   Raj    16 年前

    system.reflection.methodbase.getcurrentmethod.name做了同样的事情,看起来更容易掌握