2013-05-26 88 views
0

我正在尝试为更复杂的事件执行创建可重用的方法。我无法编译或运行不符合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”

我明白为什么我得到的错误,但不能圆想出一个办法它。

+0

你不reinveinting事件聚合? –

+0

Execute方法在生产代码中的作用是正常调用事件,或者通过调度程序调用它,我只是试图简化代码。在这种情况下,我不认为Event Aggregator足够了吗? – Lee

+0

看起来它不能没有反射:http://stackoverflow.com/questions/8407886/pass-event-as-parameter-to-a-method – Lee

回答

0

更换你的通用Execute<T>如下

public static void Execute<T>(Delegate eventToRaise, object sender, T eventArgs) where T:EventArgs 
     { 
      if (eventToRaise == null) 
       return; 

      Delegate[] registeredEventHandlers = eventToRaise.GetInvocationList(); 

      foreach (Delegate eventHandler in registeredEventHandlers) 
      { 
       object target = eventHandler.Target; // Need access to the Target property for conditions 

       // * Code deciding if should invoke the event handler * 

       eventHandler.DynamicInvoke(sender, eventArgs); 
      } 
     } 
+0

在运行时在线eventHandler.Invoke获取错误... “Delegate'System.EventHandler '有一些无效参数” – Lee

+0

与上面的DynamicInvoke一起检查 – Nair

+0

不明白为什么,但我得到:'System.Collections.Specialized.NotifyCollectionChangedEventArgs'类型的对象不能转换为类型'CallEventsViaMethod.TestEventArgs'。 – Lee