C#怎么获取当前所在的函数名_C#如何使用MethodBase读取【代码】

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产品图添加背景

相关推荐
江华森12 分钟前
Python 实现高德地图找房(一):环境搭建与数据爬虫
开发语言·爬虫·python
杜子不疼.13 分钟前
【Qt初识】信号槽(三):机制意义、断开连接与 Lambda 表达式
开发语言·数据库·qt
VIP_CQCRE43 分钟前
用 Ace Data Cloud 快速接入 OpenAI Chat Completions:对话、流式、多轮和多模态一篇打通
python·ai·openai·api·教程
老迟到的茉莉1 小时前
Hermes 是谁?跟 Claude Code 差在哪
开发语言·python
BomanGe11 小时前
NSK W1501FA高速精密滚珠丝杠技术手册
数据库·经验分享·规格说明书
kiki-bf2 小时前
可用的mysql本地安装教程
数据库·mysql
Day(AKA Elin)2 小时前
【Day】MTP(Multi Token Prediction)技术学习
python·深度学习·学习·llama
多巴胺梦想家2 小时前
数据库恢复技术:当灾难来临
网络·数据库·oracle
程序员小远3 小时前
接口测试之文件上传
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·接口测试
北冥you鱼3 小时前
Go 语言初始化 MySQL 数据库实战指南:从零到生产环境部署
数据库·mysql·golang