MethodBase.GetCurrentMethod() 是获取当前函数名最轻量可靠的方式,不依赖 PDB 或调试符号,Release 模式下仍准确有效;返回 MethodBase 可提取 Name 和 DeclaringType.Name 组成"类.方法"格式,静态/实例方法均适用,泛型名需手动截断。用 MethodBase.GetCurrentMethod() 获取当前函数名最直接多数时候你要的只是函数名字符串,MethodBase.GetCurrentMethod() 是最轻量、最可靠的方式。它不依赖调试符号或 PDB 文件,运行时就能拿到,连 Release 模式下也稳。常见错误是误用 StackTrace 去解析堆栈帧------既慢又容易在内联优化后失效,还可能因异常捕获位置偏移而取错函数。MethodBase.GetCurrentMethod().Name 返回纯函数名(如 "DoWork")MethodBase.GetCurrentMethod().DeclaringType?.Name 补上类名(如 "Worker"),组合起来就是 "Worker.DoWork"注意:静态方法和实例方法都适用;泛型方法会带签名(如 "Process<int>"),若只需原始名称,得手动截断 < 之前部分为什么不用 StackTrace 或 CallerMemberName?StackTrace 看似灵活,但实际踩坑多:JIT 内联后帧可能消失,Release 编译默认开启内联,GetFrame(1) 很可能指向调用方而非当前函数;而且构造 StackTrace 对象有明显性能开销,不适合高频日志场景。CallerMemberName 是编译器特性,必须加 [CallerMemberName] string memberName = "" 参数,本质是"让调用方帮你传名字",不是运行时反射------这意味着它不能用于间接调用(比如通过委托、事件、反射 invoke 的场景),也不适用于你无法修改函数签名的地方。需要日志埋点且函数签名已固定?用 MethodBase.GetCurrentMethod()能改函数参数、且只关心直接调用者?[CallerMemberName] 更快更干净想查调用链?别靠函数名拼,该用 DiagnosticSource 或 ActivityRelease 模式下 MethodBase.GetCurrentMethod() 还准不准?准。它不依赖 PDB 或调试信息,也不受内联影响------因为 JIT 不会把「获取当前方法元数据」这个操作给内联掉。哪怕整个函数被内联进上层,只要执行流还在那个方法体里,GetCurrentMethod() 就返回那个方法的 MethodBase。 Mokker AI AI产品图添加背景
相关推荐
l1t2 小时前
DeepSeek辅助编写埃拉托斯特尼筛法和Atkin筛法求质数程序比较阿Y加油吧2 小时前
RAG 必学:ANN 检索、HNSW 算法与 Milvus 核心概念详解Hesionberger2 小时前
LeetCode79:单词搜索DFS回溯详解kkkAloha2 小时前
PythonKiling_07043 小时前
Java方法引用与排序算法精讲Mr.朱鹏3 小时前
5.LangChain零基础速通-LCEL链式调用MZ_ZXD0013 小时前
springboot音乐播放器系统-计算机毕业设计源码76317qq_283720053 小时前
LangChain 文档切割全攻略:8 大主流切割技术选型 + 实战代码详解anew___3 小时前
从教科书到实战:深入剖析MySQL数据库恢复机制