g5i*_*der 1 c# stack-trace helpermethods
我正在使用此帮助程序来解析当前出于日志记录目的而执行的方法的名称。
[MethodImpl(MethodImplOptions.NoInlining)]
public static string GetCurrentMethod()
{
StackTrace st = new StackTrace();
StackFrame sf = st.GetFrame(1);
return sf.GetMethod().Name;
}
Run Code Online (Sandbox Code Playgroud)
这是返回的字符串<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);
});
Run Code Online (Sandbox Code Playgroud)
该方法可能是从 lambda 表达式调用的。C# 编译器实际上将 lambda 转换为类中的隐藏方法。这些方法具有特殊的编译器生成的名称,就像<Frequency>b__46您所看到的那样。我想你会发现,如果你看一下,GetFrame(2)就会看到你期望的名字。您的函数可以通过循环堆栈直到找到有效的方法名称来忽略 lambda(您可以检查方法描述符的IsSpecialName属性)。
编译器还为自动属性 getter 和 setter、事件添加/删除处理程序以及其他一些情况生成具有特殊名称的隐藏方法(您不会遇到这些方法,因为这些自动生成的方法无法调用您的GetCurrentMethod())。但还要注意,手动属性 getter 和 setter 具有“特殊”名称get_PropertyName(),例如 ,如果您有一个代码调用的属性,您可能会看到这些名称GetCurrentMethod()。