[CallerMemberName]
是 C# 中的一个特性(Attribute),用于在方法参数中标记一个字符串参数,用来自动获取调用该方法的成员名称(方法、属性、字段等)。
当在方法参数中使用了 [CallerMemberName]
特性时,如果该参数没有被显式地传入值,编译器会自动将调用方法的成员名称作为参数的默认值。这样,你就无需手动传入成员名称,而是可以直接使用方法的调用者的成员名称。
这个特性通常在实现属性更改通知(Property Change Notification)时非常有用。当你在属性的 setter 方法中调用属性更改通知事件时,可以使用 [CallerMemberName]
来自动获取当前属性的名称,避免手动传入属性名称字符串,减少了硬编码和重复代码。
例如,以下是一个简单的示例,展示了如何使用 [CallerMemberName]
特性:
1 private string _name; 2 3 public string Name 4 { 5 get { return _name; } 6 set 7 { 8 if (_name != value) 9 { 10 _name = value; 11 NotifyPropertyChanged(); // 调用属性更改通知方法 12 } 13 } 14 } 15 16 public event PropertyChangedEventHandler PropertyChanged; 17 18 protected void NotifyPropertyChanged([CallerMemberName] string propertyName = null) 19 { 20 PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 21 }
在上述示例中,当 Name
属性的值发生变化时,我们通过调用 NotifyPropertyChanged
方法来触发属性更改通知事件。由于在 NotifyPropertyChanged
方法的参数中使用了 [CallerMemberName]
,所以我们无需手动传入属性名称,编译器会自动将调用 NotifyPropertyChanged
方法的成员名称作为参数的默认值。这样,我们可以在整个类中重复使用该方法,而不必每次都手动传入属性名称。
让我们来详细解释这个例子的代码行:[CallerMemberName] string propertyName = null
[CallerMemberName]
:这是特性的名称,告诉编译器要将该参数设置为调用者的成员名称。string propertyName
:这是参数的声明,指定了参数的类型为字符串,用于存储调用者的成员名称。= null
:这是一个默认值的赋值语句,指定了参数的默认值为null
。这意味着如果在调用NotifyPropertyChanged
方法时未提供参数值,propertyName
参数将自动设置为null
。
所以,当你调用 NotifyPropertyChanged
方法时,如果不传递 propertyName
参数的值,编译器将自动将调用该方法的成员名称赋值给 propertyName
参数。这样,你就可以在方法内部使用该成员名称进行属性更改通知,而无需手动指定属性的名称。
例如,如果在属性的 setter 方法中调用 NotifyPropertyChanged()
,而没有显式传递参数值,propertyName
参数将自动设置为调用该 setter 方法的属性名称。
请注意,[CallerMemberName]
特性只能应用于方法的参数,并且要求参数类型为字符串。它不能应用于其他类型的参数或方法的返回值。
总而言之,[CallerMemberName]
特性提供了一种便捷的方式来获取方法的调用者的成员名称,通常在属性更改通知等场景下使用,减少了手动传入成员名称的工作量,提高了代码的可读性和可维护性。