自動化INotifyPropertyChanged實現
在.NET對像中,INotifyPropertyChanged
接口對於通知其他組件屬性變化至關重要。手動實現它需要為每個屬性引發PropertyChanged
事件,這可能會很繁瑣。本文探討簡化此過程的方法。
簡化實現
一種常見的方法是創建一個輔助方法,例如SetField()
,來處理引發事件的樣板代碼:
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; } // 使用SetField()的属性实现 private string name; public string Name { get { return name; } set { SetField(ref name, value, "Name"); } } }
這將屬性實現簡化為:
private string name; public string Name { get { return name; } set { SetField(ref name, value); } }
利用C#改進進行增強
C# 5引入了CallerMemberName
屬性,允許自動推斷屬性名稱:
protected bool SetField<T>(ref T field, T value, [CallerMemberName] string propertyName = null) { // ... }
有了這個增強功能,您可以進一步簡化屬性實現:
set { SetField(ref name, value); }
更高版本的C#提供了更多增強功能來簡化實現:
C# 6.0:
protected void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); }
C# 7.0:
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和可為空引用類型:
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中文網其他相關文章!