当前位置: 首页 > backend >正文

C# 如何获取当前成员函数的函数名

C# 如何获取当前成员函数的函数名

在 C# 中获取当前成员函数的名称,有以下几种常用方法:


1. 使用 MethodBase.GetCurrentMethod()(反射)

using System.Reflection;public void MyMethod()
{string methodName = MethodBase.GetCurrentMethod().Name;Console.WriteLine(methodName); // 输出 "MyMethod"
}

特点

  • 适用于任何方法(静态/实例)。
  • 有轻微性能开销(反射调用)。
  • 可以获取完整的方法信息(如参数、返回类型等)。

2. 使用 nameof(C# 6.0+)

public void MyMethod()
{Console.WriteLine(nameof(MyMethod)); // 输出 "MyMethod"
}

特点

  • 编译时确定,无运行时开销。
  • 需要硬编码方法名(如果方法名更改,会自动同步)。

3. 使用 CallerMemberName(适用于属性/事件)

using System.Runtime.CompilerServices;public void MyMethod()
{LogMethodName();
}private void LogMethodName([CallerMemberName] string methodName = null)
{Console.WriteLine(methodName); // 输出 "MyMethod"
}

特点

  • 适用于属性 get/set、事件 add/remove 等场景。
  • 不能直接用于普通方法(需通过辅助方法)。

4. 使用 StackTrace(获取调用栈信息)

using System.Diagnostics;public void MyMethod()
{var stackTrace = new StackTrace();var methodName = stackTrace.GetFrame(0).GetMethod().Name;Console.WriteLine(methodName); // 输出 "MyMethod"
}

特点

  • 性能较差,适合调试或日志场景。
  • 可获取调用链上的所有方法名。

5. 表达式树(高级用法,动态获取)

using System.Linq.Expressions;public void MyMethod()
{Console.WriteLine(GetMethodName(() => MyMethod()));
}private string GetMethodName(Expression<Action> expression)
{return ((MethodCallExpression)expression.Body).Method.Name;
}

特点

  • 灵活但复杂,适合高阶场景。

最佳实践推荐

  • 普通方法:优先用 nameof(无性能开销)。
  • 需要动态获取时:用 MethodBase.GetCurrentMethod()
  • 属性/事件:用 CallerMemberName

示例代码

using System;
using System.Reflection;class Program
{static void Main(){var demo = new Demo();demo.ShowMethodName();}
}class Demo
{public void ShowMethodName(){// 方法1: nameofConsole.WriteLine("nameof: " + nameof(ShowMethodName));// 方法2: 反射Console.WriteLine("Reflection: " + MethodBase.GetCurrentMethod().Name);}
}

输出

nameof: ShowMethodName
Reflection: ShowMethodName

根据你的需求选择最合适的方式!

http://www.xdnf.cn/news/10369.html

相关文章:

  • C语言:字符函数和字符串函数
  • SoftThinking:让模型学会模糊思考,同时提升准确性和推理速度!!
  • 电路学习(二)之电容
  • 【LaTex公式】使用align环境实现cases文本的换行
  • Java 认识异常
  • 基于FashionMnist数据集的自监督学习(生成式自监督学习AE算法)
  • 浮点数舍入规则_编程语言对比
  • HTML实现端午节主题网站:龙舟争渡,凭吊祭江诵君赋。
  • 【后端高阶面经:架构篇】52、微服务架构:微服务是银弹吗?
  • Arm处理器调试采用jlink硬件调试器的命令使用大全
  • Python训练营打卡 Day41
  • 应急响应靶机-web3-知攻善防实验室
  • 【基础算法】模拟算法
  • Redis 持久化机制详解:RDB 与 AOF 的原理、优缺点与最佳实践
  • Java-File类基本方法使用指南
  • 【深度学习】15. Segment Anything Model (SAM) :基于提示的分割新时代
  • 题解:洛谷 P12672 「LAOI-8」近期我们注意到有网站混淆视听
  • MCP架构深度解析:从基础原理到核心设计
  • c++第三章练习题
  • 每日算法-250531
  • Ubuntu使用说明
  • 112 Gbps 及以上串行链路的有效链路均衡
  • JAVA中的枚举
  • 《管理经济》期末复习题(2)
  • 缓存穿透、击穿、雪崩的解决方案
  • 开源版 PyMOL 如何绘制 Galidesivir 分子结构 ?
  • [LitCTF 2024]SAS - Serializing Authentication
  • 在Cesium中通过geojson和3d tiles分别加载楼宇白膜
  • 【深度学习】线性因子模型:数据降维与结构解析的数学透镜
  • 深入探讨redis:主从复制