首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >StackFrame.GetMethod().Name

StackFrame.GetMethod().Name
EN

Stack Overflow用户
提问于 2014-02-04 22:22:03
回答 2查看 2K关注 0票数 1

我使用此助手解析当前为日志记录目的而执行的方法的名称。

代码语言:javascript
复制
    [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是什么意思?有什么方法只检索”频率“这个词吗?”

这是在叫帮手。

代码语言:javascript
复制
    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);
    });
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-04 22:28:48

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

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

票数 4
EN

Stack Overflow用户

发布于 2014-02-04 22:24:17

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

因为您是从lambda调用方法,所以您必须接受lambda的名称超出了您的控制范围。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21564769

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档