2009-05-23 80 views
0

基本上我想要做这样的事情:有没有办法将规范的OnPropertyChanged方法写成扩展方法?

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.OnPropertyChanged("Name"); 

没什么大不了的,但它会是不错的能够调用它,如果它是一个实例方法。

+0

查看[本博客文章](http://www.gamlor.info/wordpress/?p=832)及其附件。 – 2010-12-06 12:07:19

回答

1

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

+0

是的,这并不是什么大不了的事情,但是即使它是一个班轮,也必须在每个班上编写这种方法,但这似乎并不干净。 – Davy8 2009-05-24 18:59:42