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