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

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

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

相关文章:

  • Kerberos面试内容整理-Kerberos 与 LDAP/Active Directory 的集成
  • C++哈希表:unordered系列容器详解
  • 2.5/Q2,Charls最新文章解读
  • 动态规划-376.摆动序列-力扣(LeetCode)
  • 使用HTTPS进行传输加密
  • WIN11+eclipse搭建java开发环境
  • Codesys FOR 循环之轴控
  • AIGC学习笔记(8)——AI大模型开发工程师
  • AI读懂天书:Manus AI跨语种手写识别解密
  • 【Python】解析 io.StringIO 与 io.BytesIO
  • Kafka 的 ISR 机制深度解析:保障数据可靠性的核心防线
  • Java 文件操作 和 IO(4)-- Java文件内容操作(2)-- 字符流操作
  • CloudCompare-源码分析-绘制与 3D 场景分离的“前景”元素
  • Remote Sensing投稿记录(投稿邮箱写错、申请大修延期...)风雨波折投稿路
  • 澄清 STM32 NVIC 中断优先级
  • simulink mask的使用技巧
  • SQL进阶之旅 Day 9:高级索引策略
  • C++ 命令模式:设计与实现详解
  • SOC-ESP32S3部分:22-分区表
  • AutoML详解:自动化机器学习的未来
  • 哈尔滨一恒建设/网站排名优化外包
  • 旅游网站开发网站设计报告书/2023网站seo
  • 日本做爰动漫网站/新闻最近的大事10件
  • p2p网站建设小微金融/app开发公司有哪些
  • 泰安做网站优化/seo网站推广方案
  • 网上动漫设计/汕头网站建设优化