我使用此助手解析当前为日志记录目的而执行的方法的名称。
[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);
});发布于 2014-02-04 22:28:48
该方法可能是从lambda表达式调用的。C#编译器实际上将lambda转换为类中的隐藏方法。这些方法有特殊的编译器生成的名称,比如您正在看到的<Frequency>b__46。我想你会发现,如果你看看GetFrame(2),你会看到你想要的名字。函数可以通过循环堆栈来忽略lambda,直到它找到一个有效的方法名(为此您可以检查方法描述符的IsSpecialName属性)。
编译器还为自动属性getter和setter、事件添加/删除处理程序和其他一些情况生成带有特殊名称的隐藏方法(因为这些自动生成的方法不能调用您的GetCurrentMethod()),所以不会遇到这些方法。但是还要注意的是,手动属性getter和setter具有“特殊”名称,比如get_PropertyName(),如果您有一个代码调用GetCurrentMethod()的属性,您可能会看到这些名称。
发布于 2014-02-04 22:24:17
<Frequency>b__46是调用GetCurrentMethod()的方法的名称。
因为您是从lambda调用方法,所以您必须接受lambda的名称超出了您的控制范围。
https://stackoverflow.com/questions/21564769
复制相似问题