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
根据你的需求选择最合适的方式!




![[特殊字符]《计算机组成原理》第 8 章 - CPU 的结构和功能](https://i-blog.csdnimg.cn/direct/78bf73e7d09140fcaa540e1a2c54e1b7.png)













