Проблема: Я часто хочу обработать событие в коллекции объектов. По мере добавления и удаления объектов из коллекции каждый объект должен быть подключен или отключен.Мне кажется утомительным и повторяющимся создание каждого класса, который делает это с одним и тем же кодом перехвата событий.
Желаемое решение: Итак, я пытаюсь придумать что-то вроде 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:
Я не нашел хорошего способа получить сам список обрабатывает событие, а затем вызывает делегата для любых подписчиков. Я обнаружил, что попытка использовать отражение для добавления обработчика событий требует делегата. В своих тестах я не смог найти способ сохранить параметры события и передать их подписчику .
Запрос: Есть ли другие идеи, как это можно сделать?