22

如何在 C# 中找到调用方法的全名?我已经看到了解决方案:

如何在 C# 中获取调用方法

如何找到调用当前方法的方法?

从被调用函数中获取调用函数名

但他们只给我最高水平。考虑这个例子:

namespace Sandbox
{
    class Program
    {
        static void Main(string[] args)
        {
            test();
        }

        static void test()
        {
            var stackTrace = new StackTrace();
            var methodBase = stackTrace.GetFrame(1).GetMethod();
            Console.WriteLine(methodBase.Name);
        }
    }
}

这只是输出'Main'。如何让它打印“Sandbox.Program.Main”?

这是我正在研究的一个简单的日志框架。


添加到 Matzi 的答案:

这是解决方案:

namespace Sandbox
{
    class Program
    {
        static void Main(string[] args)
        {
            test();
        }

        static void test()
        {
            var stackTrace = new StackTrace();
            var methodBase = stackTrace.GetFrame(1).GetMethod();
            var Class = methodBase.ReflectedType;
            var Namespace = Class.Namespace;         // Added finding the namespace
            Console.WriteLine(Namespace + "." + Class.Name + "." + methodBase.Name);
        }
    }
}

它会产生应有的“Sandbox.Program.Main”。

4

5 回答 5

33

这有点像这里

MethodBase method = stackTrace.GetFrame(1).GetMethod();
string methodName = method.Name;
string className = method.ReflectedType.Name;

Console.WriteLine(className + "." + methodName);
于 2012-07-06T18:38:00.367 回答
4

我认为获得全名的最佳方法是:

 this.GetType().FullName + "." + System.Reflection.MethodBase.GetCurrentMethod().Name;

或者试试这个:

string method = string.Format("{0}.{1}", MethodBase.GetCurrentMethod().DeclaringType.FullName, MethodBase.GetCurrentMethod().Name);

如果要显示最近的函数调用,可以使用:

StackTrace st  = new StackTrace();
StackFrame sf  = st.GetFrame(0);
var methodName = sf.GetMethod();

但是如果你想显示调用函数的树,你可以这样做:

if (st.FrameCount >1)
{
     // Display the highest-level function call
     // in the trace.
     StackFrame sf = st.GetFrame(st.FrameCount-1);
     Console.WriteLine("  Original function call at top of call stack):");
     Console.WriteLine("      {0}", sf.GetMethod());
}

欲了解更多信息

于 2013-06-09T20:04:00.923 回答
1

使用此方法,您可以可靠地获取全名

    public void HandleException(Exception ex, [CallerMemberName] string caller = "")
    {
        if (ex != null)
        {
            while (ex.InnerException != null)
                ex = ex.InnerException;

            foreach (var method in new StackTrace().GetFrames())
            {
                if (method.GetMethod().Name == caller)
                {
                    caller = $"{method.GetMethod().ReflectedType.Name}.{caller}";
                    break;
                }
            }

            Console.WriteLine($"Exception: {ex.Message} Caller: {caller}()");
        }
    }
于 2016-11-08T14:02:24.233 回答
0

System.Reflection.MethodBase方法GetCurrentMethod中,您可以找到有关使用类等调用堆栈的完整信息。

于 2012-07-06T18:40:26.613 回答
0

当前调用的命名空间不等于当前命名空间:

    var mNamespace = new StackTrace().GetFrames()?.Select(x =>
                {
                    try
                    {
                        return x.GetMethod().ReflectedType?.Namespace;
                    }
                    catch (Exception)
                    {
                        return string.Empty;
                    }
                }).First(x => x != new StackTrace().GetFrame(0).GetMethod().ReflectedType?.Namespace);
于 2018-07-06T10:17:11.457 回答