【问题标题】:2 Events with same name in Reflectored code?2 反射代码中同名的事件?
【发布时间】:2009-12-20 21:15:00
【问题描述】:

我在 Silverlight 中从事一个项目,我想知道 ObservableCollection 是如何工作的。在 Reflector 中看到这一点我很惊讶:

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;
...

怎么会有两个同名同类型的事件呢?这是怎么回事?这是 Reflector 中的错误吗?

【问题讨论】:

    标签: silverlight events reflector


    【解决方案1】:

    不,这是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. 前缀。

    【讨论】:

      【解决方案2】:

      这称为显式声明。这与泛型集合可以具有两个 GetEnumerator() 方法的方式相同。一个被宣布为公开的;另一个被声明为显式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-25
        • 2010-10-19
        • 1970-01-01
        • 1970-01-01
        • 2016-01-01
        • 2015-01-31
        • 2014-05-19
        • 1970-01-01
        相关资源
        最近更新 更多