C#获取当前成员函数的函数名的几种常用方法
更新时间:2026年02月25日 09:20:47 作者:Yashar Qian
本文介绍了在C#中获取当前成员函数名称的几种方法,包括反射、nameof、CallerMemberName、StackTrace和表达式树,并给出了最佳实践推荐,需要的朋友可以参考下
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: nameof
Console.WriteLine("nameof: " + nameof(ShowMethodName));
// 方法2: 反射
Console.WriteLine("Reflection: " + MethodBase.GetCurrentMethod().Name);
}
}
输出:
nameof: ShowMethodName Reflection: ShowMethodName
根据你的需求选择最合适的方式!
到此这篇关于C#获取当前成员函数的函数名的几种常用方法的文章就介绍到这了,更多相关C#获取当前成员函数函数名内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
C# 中 WebSocket 与 SignalR实时通信的两种方案
在现代 Web 应用中,实时通信变得越来越重要,无论是聊天应用、在线游戏、股票行情推送还是协作编辑工具,都需要服务器能够主动向客户端推送数据,本文将对这两种技术进行比较,分析它们的异同点和使用场景,并提供简单示例代码帮助你快速上手,感兴趣的朋友一起看看吧2025-05-05
c# 根据NPOI 读取一个excel 文件的多个Sheet
这篇文章主要介绍了c# 根据NPOI 读取一个excel 文件的多个Sheet,帮助大家更好的利用c#处理excel表格,感兴趣的朋友可以了解下2020-12-12


最新评论