C#:ObservableCollection - 为什么没有通用的“CollectionChanged”事件?

时间:2012-02-21 13:11:19

标签: c# events generics language-design

这不是一个问题,更多的东西让我感到奇怪:ObservableCollection类是通用的,但是当更改为集合时它引发的CollectionChanged事件不是。这意味着在事件处理程序中,您必须自己将从事件args对象获得的NewItems / OldItems集合中的所有对象强制转换为正确的项类型。

但是,不应该只是简单地使该事件成为通用的吗?像

这样的东西
public virtual event NotifyCollectionChangedEventHandler<T> CollectionChanged;

public delegate void NotifyCollectionChangedEventHandler(object sender, NotifyCollectionChangedEventArgs<T> e);

然后

public class NotifyCollectionChangedEventArgs<T> {
    // ...
    public IList<T> NewItems { get; }
    public IList<T> OldItems { get; }

毕竟,类型参数T已经由相关ObservableCollection的声明确定,这意味着您永远不能添加任何非{1}类型的对象无论如何(或与之兼容)到集合。因此,所有这些都应该是完全类型安全的,并且省去了必须将事件处理程序中的对象转换为我们知道应该具有的任何类型的麻烦。

有没有理由不这样做我错过了?即这是一个有意识的设计决定,还是只是一个疏忽?

1 个答案:

答案 0 :(得分:-1)

INotifyCollectionChanged接口以及INotifyPropertyChanged专门设计用于WPF框架。由于WPF是松散类型的,我猜测泛型不是那种设计的一部分。我不认为INotifyCollectionChanged被设计为直接使用。然而,ObservableCollection<T>被设计为由强类型的C#代码使用,因此设计中使用了泛型。

相关问题