C #: ObservableCollection - почему нет общего события «CollectionChanged»? - PullRequest
2 голосов
/ 21 февраля 2012

Это не столько вопрос, а еще кое-что, что показалось мне странным: класс ObservableCollection является универсальным, но событие CollectionChanged, которое возникает при изменении в коллекции, не имеет места. Это означает, что в обработчике событий вам необходимо привести все объекты в коллекциях NewItems / OldItems, которые вы получаете из объекта args события, к нужному типу элемента самостоятельно.

Но разве нельзя было просто сделать это событие общим? Что-то вроде

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, что означает, что вы никогда не сможете добавлять объекты, не относящиеся к типу T (или не совместимые с ним). ) в коллекцию в любом случае. Таким образом, все это должно быть абсолютно безопасным для типов и избавить нас от необходимости приводить объекты внутри обработчика событий к тому типу, который, как мы знаем, они должны иметь в любом случае.

Есть ли причина не делать это так, как мне не хватает? То есть это осознанное проектное решение или просто упущение?

1 Ответ

0 голосов
/ 21 февраля 2012

Интерфейс INotifyCollectionChanged вместе с INotifyPropertyChanged были разработаны исключительно для использования платформой WPF.Поскольку WPF напечатан слабо, я предполагаю, что генерики не были частью этого дизайна.Я не думаю, что INotifyCollectionChanged был разработан для непосредственного употребления.Принимая во внимание, что ObservableCollection<T> предназначен для использования в коде C #, который строго типизирован, поэтому в дизайне представлены дженерики.

...