为什么我们需要C#中的EventArgs类
本文关键字:中的 EventArgs 我们 为什么 | 更新日期: 2023-09-27 18:21:41
我知道event
关键字的目的只是与+=
运算符成对使用,以生成delegate
的列表。在构造委托时,我们可以为与该委托兼容的方法生成(参数的)任何签名。
例如,我创建代理
public delegate void StartEventHandler(object sender, StartEventArgs e);
具有两个参数:第一个具有类型对象,第二个具有类型StartEventArgs
。但在我在互联网上发现的许多文章中,该委托的第二个参数必须继承EventArgs类型。为什么我们这样做是为了让第二个参数来自/继承自任意类型?
您不需要,我相信如果您使用任意基类,代码仍然会编译,但这是一种约定。
约定是好的,因为它使那些还不熟悉您的代码的人更容易理解。如果我在C#中订阅了一个事件,我希望得到一个特定的方法签名。
它也很好,因为它使不同类型的事件可以互换。
例如,假设您有三名代表
public delegate void AEventHandler(object sender, AEventArgs e);
public delegate void BEventHandler(object sender, BEventArgs e);
public delegate void CEventHandler(object sender, CEventArgs e);
您可以编写一个符合所有三个委托的泛型方法,因为所有args对象都继承自同一基类。
public void eventMethod(object sender, EventArgs e) {
// Any one of the events fired
}
public void subscribeToEvents() {
eventA += new AEventHandler(this.eventMethod);
eventB += new BEventHandler(this.eventMethod);
eventC += new CEventHandler(this.eventMethod);
}
如果你知道的预期类型,甚至可以铸造
public void eventMethod(object sender, EventArgs e) {
// Any one of the events fired
if (e is BEventArgs) {
// Event type B fired
var eventB = e as BEventArgs;
eventB.doSomething()
}
}