我正在尝试为更复杂的事件执行创建可重用的方法。我无法编译或运行不符合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最好重载方法匹配。执行(System.EventHandler, 对象, System.Collections.Specialized.NotifyCollectionChangedEventArgs)'具有 一些无效参数
错误CS1503:参数1:不能转换从 “System.EventHandler”到 “System.EventHandler”
我明白为什么我得到的错误,但不能圆想出一个办法它。
你不reinveinting事件聚合? –
Execute方法在生产代码中的作用是正常调用事件,或者通过调度程序调用它,我只是试图简化代码。在这种情况下,我不认为Event Aggregator足够了吗? – Lee
看起来它不能没有反射:http://stackoverflow.com/questions/8407886/pass-event-as-parameter-to-a-method – Lee