C#获取当前成员函数的函数名的几种常用方法
作者: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#获取当前成员函数函数名内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
