如何获得调用方法的名称?

时间:2010-08-16 06:23:54

标签: .net

A类的Log方法可以知道是谁调用它吗?

class A
{
    public void Log(string msg)
    {
        Log.Write("method_name: " + msg);
    }
}

我想知道类的名称和方法的名称。

5 个答案:

答案 0 :(得分:4)

您可以使用StackTraceStackFrame课程。您可以通过调用StrackTrace构造函数获取整个堆栈跟踪,也可以使用StackFrame构造函数获取整个堆栈帧,该构造函数将跳过帧数。

您应该知道,由于内联,它可能不准确。 (例如,方法A内联方法B调用您的方法 - 方法A将被报告,而不是B)。

示例代码:

using System;
using System.Diagnostics;

class Test
{
    static void ShowCaller()
    {
        // Use this code if you want multiple frames
        // StackTrace trace = new StackTrace();
        // StackFrame frame = trace.GetFrame(1);

        // Use this code if you're only interested in one frame
        StackFrame frame = new StackFrame(1);
        Console.WriteLine(frame.GetMethod());
    }

    static void Intermediate()
    {
        ShowCaller();
    }

    static void Main()
    {
        Intermediate();
    }
}

作为优化发布版本运行,这将打印Void Main() - 运行调试版本时,或者如果您将更多代码放入Intermediate()方法,它将打印Void Intermediate()。< / p>

(正如评论中所提到的,这也会造成性能损失。你应该测量它以确定它在你的特定情况下是否可以接受。)

答案 1 :(得分:2)

答案 2 :(得分:1)

您也可以尝试:

 class staitc A
    {
        public staitc  void Log(string msg)
        {
            Log.Write("method_name: " + msg);
        }
    }


        using System.Reflection;

class TestClass
{
       // in method

        private void TestMethod()
    {
           A.Log(MethodBase.GetCurrentMethod().Name +MethodBase.GetCurrentMethod().DeclaringType.FullName);
    }
}

答案 3 :(得分:0)

是的,它可以 - 通过创建一个新的StackTrace对象,然后使用stackTrace.GetFrame(1).GetMethod().Name - 但是,这可能是一个昂贵的操作,所以测试并检查它不会导致你的过度减速应用

答案 4 :(得分:0)

启动.NET 4.5,您可以通过CallerMemberNameAttribute获取来电者信息,这是System.Runtime.CompilerServices命名空间的一部分:

using System.Runtime.CompilerServices;

class A
{
    public void Log(string msg, [CallerMemberName] string memberName = "")
    {
        Log.Write("{0}: {1}", memberName, msg);
    }
}