1

我正在使用这个助手来解析当前正在执行的用于记录目的的方法的名称。

    [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);
    });
4

2 回答 2

4

该方法可能是从 lambda 表达式调用的。C# 编译器实际上将 lambda 转换为类中的隐藏方法。这些方法具有特殊的编译器生成的名称,就像<Frequency>b__46您看到的那样。我想你会发现,如果你看GetFrame(2)你会看到你期望的名字。您的函数可以通过循环堆栈来忽略 lambda,直到找到有效的方法名称(您可以检查方法描述符的IsSpecialName属性)。

编译器还会为自动属性获取器和设置器、事件添加/删除处理程序以及其他一些情况生成具有特殊名称的隐藏方法(您不会遇到这些,因为这些自动生成的方法不能调用您的GetCurrentMethod(). 但还要注意,手动属性 getter 和 setter 具有“特殊”名称,例如get_PropertyName(),如果您有一个代码调用 的属性,您可能会看到这些名称GetCurrentMethod()

于 2014-02-04T22:28:48.233 回答
-1

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

由于您是从 lambda 调用该方法,因此您必须接受 lambda 的名称超出您的控制范围。

于 2014-02-04T22:24:17.347 回答