我正在尝试在不使用基类的情况下简化INotifyPropertyChanged实现。我提出的最好的是这种扩展方法:
public static bool SetNotify<T>(
this INotifyPropertyChanged sender,
ref T storage,
T value,
PropertyChangedEventHandler handler,
[CallerMemberName] string propertyName = null)
{
if (Equals(storage, value))
{
return false;
}
storage = value;
handler?.Invoke(sender, new PropertyChangedEventArgs(propertyName));
return true;
}
这样我可以在类中实现INotifyPropertyChanged
,声明一个PropertChangedEventHandler
事件处理程序,并用它来触发这样的事件:
this.SetNotify(ref _name, value, PropertyChanged);
但我很想知道是否可以使用SetNotify()
扩展方法向this
触发事件,而不传递事件处理程序。看到事件处理程序是公共的,它可以从对象外部访问。那么为什么不允许这样做呢?
public static bool SetNotify2<T>(
this INotifyPropertyChanged sender,
ref T storage,
T value,
[CallerMemberName] string propertyName = null)
{
if (Equals(storage, value))
{
return false;
}
PropertyChangedEventHandler handler = sender.PropertyChanged; // <-- Not allowed
storage = value;
handler?.Invoke(sender, new PropertyChangedEventArgs(propertyName));
return true;
}