0

基本上我想做这样的事情:

public static void OnPropertyChanged(this INotifyPropertyChanged changedObject, string propertyName)
{
    var handler = changedObject.PropertyChanged;
    if (handler != null)
    {
        var e = new PropertyChangedEventArgs(propertyName);
        handler(changedObject, e);
    }
}

这给出了“System.ComponentModel.INotifyPropertyChanged.PropertyChanged 只能在 += 或 -=" 的左侧使用

我的意思是我可以通过这样做来解决它:

public static void RaisePropertyChanged(this PropertyChangedEventHandler handler, object sender, string propertyName)
{
    if (handler != null)
    {
        var e = new PropertyChangedEventArgs(propertyName);
        handler(sender, e);
    }
}

但调用代码看起来不太好:

PropertyChanged.RaisePropertyChanged(this, "Name");

与这个:

this.OnPropertyChanged("Name");

没什么大不了的,但是能够像调用实例方法一样调用它会很好。

4

1 回答 1

1

这也违反了指导方针: On* 方法通常是基于实现实例内部的东西来做事。通常,这些方法是虚拟的,因此您可以在派生类中覆盖它们。因此,在外部使用 On* 方法是没有意义的。如果您想引发一个事件而不需要到处进行可怕的空测试,那么您确实应该使用 RaiseEvent() 扩展方法。我写了很多这些,都有重载,所以你可以只拥有 RaiseEvent(...) 并且你不必在方法中包含事件的名称。这在您使用普通 EventHandler 类型的情况下特别容易,因此您可以对更多事件使用相同的扩展方法。

于 2009-05-24T10:05:44.327 回答