StackFrame.GetMethod()。名称(StackFrame.GetMethod().N

2019-10-19 06:57发布

我使用这个帮手来解决当前正进行日志记录执行的方法的名称。

    [MethodImpl(MethodImplOptions.NoInlining)]
    public static string GetCurrentMethod()
    {
        StackTrace st = new StackTrace();
        StackFrame sf = st.GetFrame(1);

        return sf.GetMethod().Name;
    }

这是返回字符串<Frequency>b__46

“什么是b__46意思?,是有办法,只是检索词‘频率是多少?’

这是调用帮手。

    return ProxyCallWrapper.Execute<bool, IBackendJob>((backend, header) =>
    {
        header.CorrelationID = CorrelationID;
        logger.LogInfo(string.Format("### BSL CALL from {0} by {1} : CorrelationID: {2}", this.ToString(), GetCurrentMethod() ,header.CorrelationID));
        return backend.AddJob(header, jobId);
    });

Answer 1:

该方法可能正在从一个lambda表达式调用。 C#编译器实际上lambda表达式转换到你的类中隐藏的方法。 这些方法具有特殊的编译器生成的名称,如<Frequency>b__46你看到。 我认为,如果你看一下,你会发现GetFrame(2)你会看到你所期望的名称。 你的函数可以忽略循环的堆栈lambda表达式,直到它找到一个有效的方法名(可以检查方法描述符的IsSpecialName该属性)。

编译器还生成与汽车性能的getter和setter,事件添加/删除处理程序,以及其他一些情况下的特殊名称的隐藏方法(你不会遇到这些,因为这些自动生成的方法不能将自己的GetCurrentMethod() 但还要注意,手动财产的getter和setter有这样“特殊”的名字get_PropertyName()您可能会看到这些,如果你有一个属性,它的代码调用GetCurrentMethod()



Answer 2:

<Frequency>b__46是调用该方法的名称GetCurrentMethod()

既然你调用从拉姆达的方法,你必须接受的是,拉姆达的名称是无法控制的。



文章来源: StackFrame.GetMethod().Name