为什么我不能直接将自定义事件args类传递给订阅我的事件的方法?

JMK*_*JMK 2 .net c# events

为什么我不能直接将自定义事件参数传递给订阅我的事件的方法,即使我的自定义事件args类直接继承自EventArgs

例如,考虑以下两个类.一个是我想要使用的类,另一个继承自EventArgs,并包含一些与事件相关的其他信息:

using System;

namespace ConsoleApplication11
{
    class MyClass
    {
        public event EventHandler MyEvent;

        public void MyMethod(int myNumber)
        {
            Console.WriteLine(myNumber);

            if(myNumber == 7)
            {
                MyEvent.Invoke(null, new MyCustomEvent() { Foo = "Bar" });
            }
        }
    }

    class MyCustomEvent : EventArgs
    {
        public string Foo { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,如果传入一个数字7 MyMethod,我想调用MyEvent将该MyCustomEvent类的新实例传递给订阅我的事件的任何方法.

我从我的主程序订阅了这个,如下:

using System;

namespace ConsoleApplication11
{
    class Program
    {
        static void Main(string[] args)
        {
            MyClass myClass = new MyClass();
            myClass.MyEvent += new EventHandler(myClass_MyEvent);

            for (int i = 0; i < 9; i++)
            {
                myClass.MyMethod(i);
            }
        }

        static void myClass_MyEvent(object sender, EventArgs e)
        {
            //Do Stuff
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

即使我MyCustomEvent在调用事件时传入一​​个对象,如果我将订阅我的事件的方法中的第二个参数更改为一个MyCustomEvent对象,我会收到编译错误.在我可以访问类中的任何其他字段/方法等之前,我需要显式地将EventArgs对象强制转换为a MyCustomEvent.

当处理具有许多不同事件的对象时,每个事件都具有唯一的相关自定义EventArgs类,跟踪订阅每个事件的每个方法中的EventArgs需要被转换为什么可能会有点混乱.

如果我可以将自定义EventArgs类直接传递给订阅我的事件的方法,那将会容易得多.

这有可能吗?

谢谢

dle*_*lev 5

不要将事件声明为类型EventHandler,而是创建一个专门使用自定义事件args类的新委托:

public delegate void MyEventHandler(object sender, MyEventArgs args);
public event MyEventHandler MyEvent;
Run Code Online (Sandbox Code Playgroud)

现在,您可以直接传递参数而无需强制转换.

另一种选择是使用通用EventHandler<T>:

public event EventHandler<MyEventArgs> MyEvent;
Run Code Online (Sandbox Code Playgroud)

我更喜欢前者,因为您可以为委托类型提供更具描述性的名称,尽管后者更快一些.