Подключение к событию всех объектов в списке

Проблема: Я часто хочу обработать событие в коллекции объектов. По мере добавления и удаления объектов из коллекции каждый объект должен быть подключен или отключен.Мне кажется утомительным и повторяющимся создание каждого класса, который делает это с одним и тем же кодом перехвата событий.

Желаемое решение: Итак, я пытаюсь придумать что-то вроде EventBindingList ], который содержит подключаемые объекты и позволяет пользователю подключать несколько объектов одновременно, а также добавлять и удалять объекты в списке.

Чтобы сохранить его универсальным, необходимо использовать Reflection. В конструкторе списка пользователь может указать по EventInfo или по имени события, какое событие перехватывается. Это показалось самым простым способом.

    private EventInfo _info;

    public EventBindingList(string EventName)
    {
        _info = typeof(T).GetEvents().Where(e => e.Name == EventName).First();
    }

    public EventBindingList(EventInfo info)
    {
        _info = info;
    }

Я пробовал несколько подходов, но у меня по-прежнему возникают проблемы с различиями между методами, делегатами, лямбда-выражениями и обработчиками событий.

Неудачное решение 1:

Одно решение Я попробовал, но не сработал - использовать настраиваемый аксессуар событий. Это будет событие в списке, содержащем подключаемые объекты. Это связано с тем, что при добавлении EventHandler возникает исключение ArgumentException: Объект типа «System.EventHandler» не может быть преобразован в тип «ExternalProject.CustomEventHandler». Я попытался преобразовать EventHandler к правильному типу (используя аргументы универсального типа, поскольку это обработчик событий внешнего проекта), но преобразование завершилось неудачно.

    public event EventHandler ElementEvent
    {
        add
        {
            _handlers.Add(value);
            foreach (T t in this)
            {
                _info.AddEventHandler(t, value);
            }
        }
        remove
        {
            foreach (T t in this)
            {
                _info.RemoveEventHandler(t, value);
            }
            _handlers.Remove(value);
        }
    }

Неудачное решение 2:

Я не нашел хорошего способа получить сам список обрабатывает событие, а затем вызывает делегата для любых подписчиков. Я обнаружил, что попытка использовать отражение для добавления обработчика событий требует делегата. В своих тестах я не смог найти способ сохранить параметры события и передать их подписчику .

Запрос: Есть ли другие идеи, как это можно сделать?

6
задан Nathan 11 July 2011 в 17:01
поделиться