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, object, System.Collections.Specialized.NotifyCollectionChangedEventArgs)”的最佳重载方法匹配有一些无效参数

错误 CS1503:参数 1:无法从“System.EventHandler”转换为“System.EventHandler”

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

4

1 回答 1

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);
            }
        }
于 2013-05-26T22:46:55.820 回答