c# - 为什么我不能直接将自定义事件参数类传递到订阅我的事件的方法中?

标签 c# .net events

为什么我不能直接将自定义事件参数传递到订阅我的事件的方法中,即使我的自定义事件参数类直接继承自 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; }
    }
}

因此,如果将数字 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
        }
    }
}

即使我在调用事件时传入了一个 MyCustomEvent 对象,如果我将订阅我的事件的方法中的第二个参数更改为 MyCustomEvent 对象,我会得到编译错误。我需要先将 EventArgs 对象显式转换为 MyCustomEvent,然后才能访问类中的任何其他字段/方法等。

当处理一个有很多不同事件的对象时,每个事件都有一个唯一的相关自定义 EventArgs 类,跟踪订阅每个事件的每个方法中的 EventArgs 需要转换的内容可能会有点乱。

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

有这种可能吗?

谢谢

最佳答案

而不是将您的事件声明为 EventHandler 类型,创建一个专门使用您的自定义事件参数类的新委托(delegate):

public delegate void MyEventHandler(object sender, MyEventArgs args);
public event MyEventHandler MyEvent;

现在您可以直接传递参数而无需转换。

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

public event EventHandler<MyEventArgs> MyEvent;

我更喜欢前者,因为您可以为委托(delegate)类型指定一个更具描述性的名称,尽管后者更快一些。

关于c# - 为什么我不能直接将自定义事件参数类传递到订阅我的事件的方法中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11509001/

相关文章:

C#检测所有窗口中的按键事件

c# - 每次使用时检查属性是否为空?

Java:是否可以(在运行时)获取 future 方法调用的源文件名和行号?

c# - 如何在关闭表单之前验证表单的控件?

C# - 固定/内联数组

c# - 当用户关闭表单时,我是否必须关闭正在运行的BackgroundWorkers?

c# - 错误 : System. NullReferenceException:对象引用未设置到对象的实例

c# - PredicateBuilder 是如何工作的

javascript - 使用 onkeydown 事件在一个函数中插入 click 事件

c# - 将现有文件添加到文件夹