
自動化INotifyPropertyChanged實現
在.NET對像中,INotifyPropertyChanged
接口對於通知其他組件屬性變化至關重要。手動實現它需要為每個屬性引發PropertyChanged
事件,這可能會很繁瑣。本文探討簡化此過程的方法。
簡化實現
一種常見的方法是創建一個輔助方法,例如SetField()
,來處理引發事件的樣板代碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | public class Data : INotifyPropertyChanged {
protected bool SetField<T>(ref T field, T value, string propertyName) {
if (EqualityComparer<T>.Default.Equals(field, value)) return false;
field = value;
OnPropertyChanged(propertyName);
return true;
}
private string name;
public string Name {
get { return name; }
set { SetField(ref name, value, "Name" ); }
}
}
|
登入後複製
這將屬性實現簡化為:
1 2 3 4 5 | private string name;
public string Name {
get { return name; }
set { SetField(ref name, value); }
}
|
登入後複製
利用C#改進進行增強
C# 5引入了CallerMemberName
屬性,允許自動推斷屬性名稱:
1 2 3 | protected bool SetField<T>(ref T field, T value, [CallerMemberName] string propertyName = null) {
}
|
登入後複製
有了這個增強功能,您可以進一步簡化屬性實現:
1 | set { SetField(ref name, value); }
|
登入後複製
更高版本的C#提供了更多增強功能來簡化實現:
C# 6.0:
1 2 3 | protected void OnPropertyChanged([CallerMemberName] string propertyName = null) {
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
|
登入後複製
C# 7.0:
1 2 3 4 5 6 7 8 9 10 11 | protected void OnPropertyChanged(string propertyName) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
protected bool SetField<T>(ref T field, T value, [CallerMemberName] string propertyName = null) {
}
private string name;
public string Name {
get => name;
set => SetField(ref name, value);
}
|
登入後複製
C# 8.0和可為空引用類型:
1 2 3 4 5 6 7 8 9 10 11 12 13 | public event PropertyChangedEventHandler? PropertyChanged;
protected void OnPropertyChanged(string propertyName) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
protected bool SetField<T>(ref T field, T value, [CallerMemberName] string propertyName = "" ) {
}
private string name;
public string Name {
get => name;
set => SetField(ref name, value);
}
|
登入後複製
這些增強功能顯著簡化了INotifyPropertyChanged
的實現,使其在現代版本的C#中不再是一項繁瑣的任務。
以上是如何簡化C#中的InotifyPropertychanged實現?的詳細內容。更多資訊請關注PHP中文網其他相關文章!