Я пытаюсь создать метод многократного использования для более сложного выполнения события. Я не могу заставить его скомпилировать или запустить с фреймворком событий, которые не следуют шаблону EventHandler<Type>
. Я хотел бы избежать отражения, если это возможно, так как это будет сильно используемое событие.Поднять событие с помощью общего метода
Я создал приложение тест консоли ниже, который иллюстрирует эту проблему: сообщения
using System;
using System.Collections.Specialized;
namespace CallEventsViaMethod
{
public class TestEventArgs : EventArgs { }
class Program
{
static void Main(string[] args)
{
MyProgram program = new MyProgram();
program.Go();
Console.ReadKey(false);
}
}
public class MyProgram
{
public event EventHandler<TestEventArgs> TestEvent;
public event NotifyCollectionChangedEventHandler CollectionChangedEvent;
public void Go()
{
TestEvent += new EventHandler<TestEventArgs>(MyProgram_TestEvent);
CollectionChangedEvent += new NotifyCollectionChangedEventHandler(MyProgram_CollectionChangedEvent);
// Want a reusable method I can use to conditionally execute any event
GeneralEventExecutor.Execute<TestEventArgs>(TestEvent, new Object(), new TestEventArgs());
GeneralEventExecutor.Execute<NotifyCollectionChangedEventArgs>(TestEvent, new Object(), new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
}
void MyProgram_TestEvent(object arg1, TestEventArgs arg2)
{
Console.WriteLine("Custom event ran");
}
void MyProgram_CollectionChangedEvent(object sender, NotifyCollectionChangedEventArgs e)
{
Console.WriteLine("NotifyCollectionChangedEventHandler event ran");
}
}
public static class GeneralEventExecutor
{
public static void Execute<T>(EventHandler<T> eventToRaise, object sender, T eventArgs) where T : EventArgs
{
if (eventToRaise == null)
return;
Delegate[] registeredEventHandlers = eventToRaise.GetInvocationList();
foreach (EventHandler<T> eventHandler in registeredEventHandlers)
{
object target = eventHandler.Target; // Need access to the Target property
// * Code deciding if should invoke the event handler *
eventHandler.Invoke(sender, eventArgs);
}
}
}
}
ошибки:
ошибка CS1502: лучший перегруженный матч метод для «CallEventsViaMethod.GeneralEventExecutor. Execute (System.EventHandler, объект, System.Collections.Specialized.NotifyCollectionChangedEventArgs) 'имеет некоторые недопустимые аргументы
ошибка CS1503: Аргумент 1: не может конвертировать из «System.EventHandler» в «System.EventHandler»
Я понимаю, почему я получаю эту ошибку, но не могу придумать, как круглый Это.
Не вы reinveinting на событие Aggregator? –
Что делает метод Execute в моем производственном коде, это либо вызывать событие нормально, либо вызывать его через диспетчер, я просто пытался сохранить код простым. Я не думаю, что агрегатор событий в этом случае будет достаточным? – Lee
Похоже, что это невозможно сделать без отражения: http://stackoverflow.com/questions/8407886/pass-event-as-parameter-to-a-method – Lee