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产品图添加背景
相关推荐
笃行3507 小时前
OceanBaseVS金仓:一条 SQL 的两条路——KingbaseES 的性能竞争力从哪来其实防守也摸鱼7 小时前
每天一个知识点——RCE漏洞AIFQuant7 小时前
Python实时外汇行情接入实战:WebSocket与REST K线查询TDengine (老段)7 小时前
TDengine 常见问题 TOP2笃行3507 小时前
数据迁移工具 KDMS 帮我把一本糊涂账算清了babe小鑫7 小时前
生物统计学专业校招:SAS、R、Python学习顺序实用指南vx_Biye_Design7 小时前
springboot游泳馆系统93765-计算机课程设计、毕业设计固定资产管理系统软件8 小时前
该去哪里找专业靠谱的智慧智能设备固定资产管理系统?ctlover8 小时前
LangChain 概述专业程序开发源8 小时前
springbootLivehouse票务系统-计算机课程设计、毕业设计