今天跟大家唠唠我最近在项目里用 `eventargs` 的一些心得,这东西看着简单,用起来还是有些门道的。
我接到个需求,大概就是界面上一个按钮,点击后要触发一系列的操作,这些操作之间需要传递一些数据。最开始我啥也没想,直接用委托加事件,数据就直接塞到委托的参数里,简单粗暴。就像这样:
public event Action<string> MyEvent;
void OnButtonClick()
MyEvent?.Invoke("我是要传递的数据");
完事儿! 跑起来是没问题,但是很快问题就来。需求变更,需要传递的数据越来越多,类型也越来越复杂。委托的参数列表变得越来越长,简直没法看。而且如果不同的事件处理函数只需要其中的一部分数据,那其他的参数就显得非常冗余。
这时候,我就想起 `EventArgs` 这玩意儿。这东西是专门用来封装事件数据的,用起来也挺简单。我定义一个类,继承自 `EventArgs`,把所有需要传递的数据都放到这个类里面。

public class MyEventArgs : EventArgs
public string Message { get; set; }
public int Number { get; set; }
public bool Flag { get; set; }

然后,我修改事件的委托类型,使用 `EventHandler<MyEventArgs>`,这样事件处理函数就可以接收到 `MyEventArgs` 类型的参数。
public event EventHandler<MyEventArgs> MyEvent;

void OnButtonClick()
MyEvent?.Invoke(this, new MyEventArgs { Message = "我是消息", Number = 123, Flag = true });
这样一来,代码立马变得清晰多。事件处理函数可以根据自己的需要,从 `EventArgs` 中取出需要的数据,而不用关心其他的数据。而且如果以后需要添加新的数据,只需要在 `MyEventArgs` 类中添加新的属性就可以,不用修改委托的类型,也不用修改事件处理函数的签名。
用 `EventArgs` 之后,我的代码可读性大大提高。而且`EventArgs` 还可以配合 `sender` 参数一起使用,`sender` 参数表示事件的发送者,这样事件处理函数就可以知道是哪个对象触发事件。这在一些复杂的场景下非常有用。
`EventArgs` 也有一些需要注意的地方。比如,`EventArgs` 默认是按引用传递的,如果需要修改 `EventArgs` 中的数据,可能会影响到事件发送者。在某些情况下,可能需要使用 `struct` 来定义事件数据,这样可以保证数据的独立性。
`EventArgs` 是一个非常有用的工具,可以帮助我们更好地组织事件数据,提高代码的可读性和可维护性。如果你还在为事件数据的传递而烦恼,不妨试试 `EventArgs`,说不定能给你带来惊喜。
总结一下我的实践步骤:
- 第一步:定义一个类,继承自 `EventArgs`,用于封装事件数据。
- 第二步:在类中添加需要的属性,用于存储事件数据。
- 第三步:修改事件的委托类型,使用 `EventHandler<你的EventArgs类型>`。
- 第四步:在触发事件的时候,创建 `EventArgs` 实例,并填充数据。
- 第五步:在事件处理函数中,从 `EventArgs` 中取出需要的数据。
就这样,搞定!希望我的经验能帮到你!