Подписка на ObservableCollection посредством отражения - PullRequest
1 голос
/ 18 июня 2010

Как я могу подписаться на ObservableCollection<??>, не зная тип элемента коллекции? Есть ли способ сделать это без слишком большого количества «волшебных строк»?

Это вопрос к .NET версии 3.5. Я думаю, что 4.0 сделает мою жизнь намного проще, верно?

Type type = collection.GetType();
if(type.IsGenericType 
   && type.GetGenericTypeDefinition() == typeof(ObservableCollection<>))
{
    // I cannot cast the collection here
    ObservableCollection<object> x = collection;
}

Спасибо за ваше время.

Ответы [ 2 ]

5 голосов
/ 18 июня 2010

ObservableCollection реализует INotifyCollectionChanged интерфейс, поэтому он может быть очень простым:

((INotifyCollectionChanged) collection).CollectionChanged += 
        collection_CollectionChanged;
1 голос
/ 18 июня 2010

Вы должны иметь возможность подписаться на CollectionChanged с небольшим количеством размышлений:

void AddCollectionChangedHandler(ICollection collection, NotifyCollectionChangedEventHandler handler)
{
    Type type = collection.GetType();
    if(type.IsGenericType
       && type.GetGenericTypeDefinition() == typeof(ObservableCollection<>))
    {
        EventInfo collectionChanged = type.GetEvent("CollectionChanged");
        collectionChanged.AddEventHandler(collection, handler);
    }
}

Он использует одну «волшебную строку», но подписывает данный обработчик на событие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...