有没有办法将规范的OnPropertyChanged方法编写为扩展方法?

时间:2009-05-23 17:15:06

标签: extension-methods inotifypropertychanged

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

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");

vs this:

this.OnPropertyChanged("Name");

没什么大不了的,但能够将它称为实例方法就好了。

1 个答案:

答案 0 :(得分:1)

它也违反了准则:On *方法通常是基于INSIDE实现实例的东西来做事情。通常,这些方法是虚拟的,因此您可以在派生类中覆盖它们。因此,在外部使用On *方法毫无意义。如果你想在没有可怕的空值测试的情况下引发事件,你确实应该使用RaiseEvent()扩展方法。我写了很多这些,都有重载,所以你可以只有RaiseEvent(...),你不必在方法中包含事件的名称。例如,在您使用常规EventHandler类型的情况下,这尤其容易,因此您可以对更多事件使用相同的扩展方法。