C# 如何获取当前方法的名称 - CallerMemberName特性的应用

来源:这里教程网 时间:2026-02-21 17:38:21 作者:

在 C# 中,获取当前方法的名称通常用于日志记录、调试或异常追踪等场景。虽然可以通过反射或堆栈遍历来实现,但最轻量且推荐的方式是使用 CallerMemberName 特性。

什么是 CallerMemberName 特性?

CallerMemberName 是 .NET Framework 4.5 引入的一个特性,属于“调用方信息”(Caller Info)的一部分。它可以在不依赖反射和堆栈分析的前提下,自动将调用方法的方法名作为默认参数传入。

该特性应用于可选参数上,编译器会在调用时自动填充调用者的方法名称(字符串形式)。

如何使用 CallerMemberName?

以下是一个典型的使用示例:

public void LogMessage(string message, [CallerMemberName] string memberName = "")
{
    Console.WriteLine($"[{memberName}] {message}");
}

// 调用示例
LogMessage("程序开始运行"); // 输出: [YourCallingMethodName] 程序开始运行

在这个例子中,你无需显式传入方法名,编译器会自动将调用 LogMessage 的方法名称填入 memberName 参数。

实际应用场景

日志记录:自动标注日志来源方法,减少手动输入错误。 INotifyPropertyChanged 接口实现:在属性变更通知中避免硬编码属性名。

例如,在 ViewModel 中实现属性通知:

private string _name;
public string Name
{
    get => _name;
    set
    {
        _name = value;
        OnPropertyChanged();
    }
}

public event PropertyChangedEventHandler PropertyChanged;

protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

这样,无论哪个属性调用 OnPropertyChanged(),都能正确传递属性名,避免因重命名导致的绑定失效问题。

注意事项

参数必须是可选的,并带有默认值(通常为 null 或 "")。 只能用于直接调用的方法,通过反射或动态调用不会触发编译器注入。 适用于实例方法、静态方法,但不能用于构造函数、析构函数或属性访问器以外的上下文(如字段初始化)。

基本上就这些。使用 CallerMemberName 可以让代码更简洁、安全,避免魔法字符串,提升可维护性。不复杂但容易忽略。

相关推荐