Проблема: Я часто хочу обработать событие в коллекции объектов.Поскольку объекты добавляются и удаляются из коллекции, каждый объект должен быть подключен или отключен.Я нахожу это утомительным и повторяющим для разработки каждого класса, который делает это с тем же кодом перехвата событий.
Желаемое решение: Итак, я пытаюсь придумать что-то вроде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;
}
Я испробовал несколько подходов, но у меня продолжают возникать проблемы с различиями между методами, делегатами, лямбдами и EventHandlers.
Неудачное решение 1:
Я попробовал одно решение, которое не сработало, - использовать пользовательский метод доступа к событиям.Это будет событие в списке, содержащее объекты для подключения.Это связано с тем, что при добавлении EventHandler создается исключение ArgumentException: Object of type 'System.EventHandler' cannot be converted to type '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:
Я не нашел хорошего способа, чтобы сам список обрабатывал событие, а затем вызывал делегата для любых подписчиков.Я обнаружил, что попытка использовать отражение для добавления обработчика события требует делегата.В моих тестах Я не смог найти способ сохранить параметры события, а также передать их подписчику .
Запрос: Есть ли какие-либодругие идеи о том, как это может быть достигнуто?