2013-05-26 3 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. Execute (System.EventHandler, объект, System.Collections.Specialized.NotifyCollectionChangedEventArgs) 'имеет некоторые недопустимые аргументы

ошибка CS1503: Аргумент 1: не может конвертировать из «System.EventHandler» в «System.EventHandler»

Я понимаю, почему я получаю эту ошибку, но не могу придумать, как круглый Это.

+0

Не вы reinveinting на событие Aggregator? –

+0

Что делает метод Execute в моем производственном коде, это либо вызывать событие нормально, либо вызывать его через диспетчер, я просто пытался сохранить код простым. Я не думаю, что агрегатор событий в этом случае будет достаточным? – 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

Получите ошибку во время выполнения on line eventHandler.Invoke ... «Делегировать» System.EventHandler 'имеет некоторые недопустимые аргументы " – Lee

+0

Проверить сейчас с DynamicInvoke, как указано выше – Nair

+0

Не понимаю, почему, но я получаю: Object типа« System.Collections.Specialized.NotifyCollectionChangedEventArgs »не может быть преобразуется в тип «CallEventsViaMethod.TestEventArgs». – Lee

Смежные вопросы