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

相关推荐
Decay__2 小时前
VMware 安装 SQL Server 双节点 AlwaysOn 可用性组教程 —— WSFC、AG 与侦听器完整部署(系列核心篇)
运维·数据库·sql·mysql·架构
databook2 小时前
时间序列数据,先拆规律还是先查异常
python·数据挖掘·数据分析
茶栀(*´I`*)2 小时前
SQL 性能分析:从慢查询日志到执行计划的完整定位方法
数据库·sql
师夷长技以自愈3 小时前
手搓 AI Agent 第 8 篇:从手写循环到画流程图——LangGraph 封装
人工智能·python
艺杯羹3 小时前
1Panel 装好后 ufw 仍是 inactive:一次服务器安全盲区复盘
服务器·数据库·安全·网络安全·系统架构·实战·1panel
jyOverQ3 小时前
从零学 JVM(六):垃圾回收算法详解——标记清除、标记复制与标记整理
jvm·算法
aifannihao4 小时前
Rust 1.100 的 DropGuard:用 Python 实测失败回滚与吞异常
python·rust·异常处理·标准库·contextlib
code2cat4 小时前
【随笔】MCP工具重试:任务已经创建,响应丢了怎么办
数据库·mcp
用户019027581615 小时前
天勤 tqsdk 能做 A 股行情吗?期货强项与股票数据选型
python
wuyk5555 小时前
Spider-第10讲-SQLite持久化与去重
数据库·爬虫·sqlite