C#中如何通过ref实现支持任意类型的通用属性变更通知方法?
完全可以通过泛型方法实现不区分类型的通用属性更新通知方法,无需为每个参数类型单独写重载。
核心修改思路是把方法声明为泛型方法,用泛型参数<T>替代具体的int、string等类型,同时使用EqualityComparer<T>.Default来判断新旧值是否相等,兼容所有值类型、引用类型和可空类型的相等判断。
修改后的完整实现代码如下:
using System.Collections.Generic; using System.ComponentModel; using System.Runtime.CompilerServices; public class MainClass : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; // 通用泛型方法,支持任意类型的属性更新通知 public void NotifyPropertyChange<T>(ref T prop, T value, [CallerMemberName] string propertyName = "") { // 使用泛型默认相等比较器,兼容所有类型的相等判断 if (!EqualityComparer<T>.Default.Equals(prop, value)) { prop = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } }
使用示例,所有类型的属性都可以直接调用该方法,无需额外修改:
public class TestClass: MainClass { private int _myInt; private string _myString; private bool? _myNullableBool; public int MyIntProperty { get => _myInt; set => NotifyPropertyChange(ref _myInt, value); } public string MyStringProperty { get => _myString; set => NotifyPropertyChange(ref _myString, value); } public bool? MyNullableBoolProperty { get => _myNullableBool; set => NotifyPropertyChange(ref _myNullableBool, value); } }
该实现的优势:
- 无需为每种值类型、引用类型单独编写方法重载,一套实现覆盖所有类型场景
- 用
EqualityComparer<T>.Default做相等判断避免了泛型场景下直接使用==的兼容性问题,对自定义类型也会自动调用其重写的Equals方法或者默认值比较逻辑 - 原有调用方式完全不需要修改,和之前的重载方法调用逻辑一致,可无缝替换
内容的提问来源于stack exchange,提问作者خالد بشير
相关产品推荐
相关产品推荐

