自动化INotifyPropertyChanged实现
在.NET对象中,INotifyPropertyChanged
接口对于通知其他组件属性变化至关重要。手动实现它需要为每个属性引发PropertyChanged
事件,这可能会很繁琐。本文探讨简化此过程的方法。
简化实现
一种常见的方法是创建一个辅助方法,例如SetField()
,来处理引发事件的样板代码:
<code class="language-csharp">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"); } } }</code>
这将属性实现简化为:
<code class="language-csharp">private string name; public string Name { get { return name; } set { SetField(ref name, value); } }</code>
利用C#改进进行增强
C# 5引入了CallerMemberName
属性,允许自动推断属性名称:
<code class="language-csharp">protected bool SetField<T>(ref T field, T value, [CallerMemberName] string propertyName = null) { // ... }</code>
有了这个增强功能,您可以进一步简化属性实现:
<code class="language-csharp">set { SetField(ref name, value); }</code>
更高版本的C#提供了更多增强功能来简化实现:
C# 6.0:
<code class="language-csharp">protected void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); }</code>
C# 7.0:
<code class="language-csharp">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); }</code>
C# 8.0和可为空引用类型:
<code class="language-csharp">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); }</code>
这些增强功能显着简化了INotifyPropertyChanged
的实现,使其在现代版本的C#中不再是一项繁琐的任务。
以上是如何简化C#中的InotifyPropertychanged实现?的详细内容。更多信息请关注PHP中文网其他相关文章!