CallerMemberName 是 .NET 4.5 引入的调用方信息特性,可自动将调用方法名作为默认参数传入,用于日志、INotifyPropertyChanged 等场景,需配合可选参数使用,编译器注入,不适用于反射或动态调用。

在 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 可以让代码更简洁、安全,避免魔法字符串,提升可维护性。不复杂但容易忽略。










