从扩展类调用事件而不传递事件

时间:2018-03-08 11:33:37

标签: c# events inotifypropertychanged

我正在尝试在不使用基类的情况下简化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;
}

0 个答案:

没有答案