2009-12-20 56 views
0

我在Silverlight中的一個項目上工作,我想知道ObservableCollection是如何工作的。我很驚訝地看到這在反射器:2反射代碼中具有相同名稱的事件?

public class ObservableCollection<T> : 
      Collection<T>, INotifyCollectionChanged, INotifyPropertyChanged 
{ 
    // Fields 
    private bool _busy; 

    // Events 
    public event NotifyCollectionChangedEventHandler CollectionChanged; 

    protected event PropertyChangedEventHandler PropertyChanged; 

    event PropertyChangedEventHandler INotifyPropertyChanged.PropertyChanged; 
... 

它怎麼能有2個事件具有相同的名稱和類型?這是怎麼回事?這是Reflector中的錯誤嗎?

回答

2

不,這是explicit interface implementation。此行:

protected event PropertyChangedEventHandler PropertyChanged; 

無法實施INotifyPropertyChanged合同,因爲它不是公共的。其他類不能引用它,所以ObservableCollection不會像它實現它所說的接口那樣看待它的客戶端。例如。

ObservableCollection<string> coll; 
// ObservableCollection implements INotifyPropertyChanged, so I should be able to... 
coll.PropertyChanged += ... 
// ... but this wouldn't compile because PropertyChanged is protected 

爲了解決這個問題,增加的ObservableCollection另一實施的PropertyChanged,這是 「作用域」,以INotifyPropertyChanged接口的。也就是說,它只有在客戶端通過類型INotifyPropertyChanged的引用訪問ObservableCollection時纔可用,在這種情況下,它是有效公開的。所以,現在誰想要使用的ObservableCollection實現INotifyPropertyChanged會很高興的事實,因爲他們正在尋找的事件是有客戶:

INotifyPropertyChanged notifier = coll; 
notifier.PropertyChanged += ... // compiles (using explicit implementation) 

但增加的PropertyChanged不具有相同的保護成員發生衝突名稱,因爲它的範圍是INotifyPropertyChanged.前綴。

0

它被稱爲顯式聲明。泛型集合可以有兩個GetEnumerator()方法。一個被宣佈爲公開;另一個被宣佈爲明確的。