每次我开始深入 C# 项目时,我都会遇到很多真正只需要传递一个项目的事件。我坚持EventHandler
/EventArgs
练习,但我喜欢做的是:
public delegate void EventHandler<T>(object src, EventArgs<T> args);
public class EventArgs<T>: EventArgs {
private T item;
public EventArgs(T item) {
this.item = item;
}
public T Item {
get { return item; }
}
}
以后,我可以拥有我的
public event EventHandler<Foo> FooChanged;
public event EventHandler<Bar> BarChanged;
然而,.NET 的标准似乎是EventArgs
为每种类型的事件创建一个新的委托和子类。我的通用方法有问题吗?
编辑:这篇文章的原因是我刚刚在一个新项目中重新创建了它,并想确保它没问题。实际上,我在发布时正在重新创建它。我发现有一个泛型
EventHandler<TEventArgs>
,所以你不需要创建泛型委托,但你仍然需要泛型EventArgs<T>
类,因为TEventArgs: EventArgs
.
另一个编辑:内置解决方案的一个缺点(对我来说)是额外的冗长:
public event EventHandler<EventArgs<Foo>> FooChanged;
对比
public event EventHandler<Foo> FooChanged;
但是,客户注册您的活动可能会很痛苦,因为默认情况下会导入 System 命名空间,因此即使使用像 Resharper 这样的花哨工具,他们也必须手动查找您的命名空间......任何人都对此有任何想法?