2009-05-23 86 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