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产品图添加背景
相关推荐
闪电悠米8 小时前
黑马点评-优惠券秒杀-04_one_user_one_order许彰午8 小时前
03_Java流程控制详解YL200404268 小时前
【Redis实战篇】基于Redis的分布式锁的原理及实现兔子宇航员03018 小时前
HiveSQL 中 NULL 与空字符串的区别与注意事项2201_761199048 小时前
python运维1盼小辉丶8 小时前
PyTorch深度学习实战(55)——在Android上部署PyTorch模型杨云龙UP8 小时前
Oracle CDB巡检脚本使用SOP:从HTML原始报告到Word正式交付_2026-05-29保定公民8 小时前
Oracle 层次查询(CONNECT BY)完全指南:从入门到精通SunnyDays10118 小时前
使用 Python 加密、保护和签名 PowerPoint 演示文稿 (PPT)Wonderful U8 小时前
Django+Python后端实战|AI智能图像去水印系统:基于OpenCV+大模型实现无损图片水印消除