通过一般方法提升事件

时间:2013-05-26 22:33:25

标签: c# events

我正在尝试为更复杂的事件执行创建可重用的方法。我无法使用不遵循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'

我理解为什么我会收到错误,但无法找到解决方法。

1 个答案:

答案 0 :(得分: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);
            }
        }