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