.NET是否有内置的EventArgs <T>?

我正在准备为带有一个参数的事件参数创build一个通用的EventArgs类:

public class EventArg<T> : EventArgs { // Property variable private readonly T p_EventData; // Constructor public EventArg(T data) { p_EventData = data; } // Property for EventArgs argument public T Data { get { return p_EventData; } } } 

在我这样做之前,C#是否具有内置在该语言中的相同function? 我似乎记得在C#2.0出来的时候碰到类似的东西,但是现在我找不到它了。

或者换一种说法,我是否必须创build自己的通用EventArgs类,或者C#提供了吗? 谢谢你的帮助。

不,你可能想到了EventHandler<T> ,它允许你为任何特定types的EventArgs定义委托。

尽pipe如此,我个人并不认为EventArgs<T>是非常合适的。 在事件参数中用作“有效载荷”的信息在我看来应该是一个自定义的类,使其使用和期望的属性非常清晰。 使用generics类将会阻止您将有意义的名称放置到位。 (“数据”代表什么?)

我必须说,我不明白这里所有的“纯粹主义者”。 也就是说,如果你已经定义了一个包类 – 它具有所有的细节,属性等 – 为什么黑客创build一个额外的不必要的类只是为了能够遵循事件/参数机制,签名风格? 事情是 – 不是在.NET中的所有东西 – 或者从这个问题上“失踪” – 是“好” – MS已经“纠正”多年了…我会说只是去创造一个 – 像我一样 – 因为我需要这样 – 为我节省了很多时间,

它确实存在。 至less,现在呢。

您可以在一些不同的Microsoft程序集/命名空间中findDataEventArgs<TData> ,例如Microsoft.Practices.Prism.Events 。 但是,这些名称空间在项目中可能不太自然,因此您可能只使用自己的实现。

如果你select不使用棱镜 ,但仍然想尝试一个通用的EventArgs方法。

 public class GenericEventArgs<T> : EventArgs { public T EventData { get; private set; } public GenericEventArgs(T EventData) { this.EventData = EventData; } } 

//使用下面的示例代码来声明ObjAdded事件

 public event EventHandler<GenericEventArgs<TargetObjType>> ObjAdded; 

//使用下面的示例代码来引发ObjAdded事件

 private void OnObjAdded(TargetObjType TargetObj) { if (ObjAdded!= null) { ObjAdded.Invoke(this, new GenericEventArgs<TargetObjType>(TargetObj)); } } 

// Finnaly你可以订阅你的ObjAdded事件

 SubscriberObj.ObjAdded += (object sender, GenericEventArgs<TargetObjType> e) => { // Here you can explore your e.EventData properties }; 

没有内置的一般的ARGS。 如果你遵循微软的EventHandler模​​式,那么你实现你的派生的EventArgs像你所build议的: public class MyStringChangedEventArgs : EventArgs { public string OldValue { get; set; } } public class MyStringChangedEventArgs : EventArgs { public string OldValue { get; set; } } public class MyStringChangedEventArgs : EventArgs { public string OldValue { get; set; } }

但是,如果您的团队风格指南接受简化 – 您的项目可以使用一个轻量级事件,如下所示:

 public event Action<object, string> MyStringChanged; 

用法:

 // How to rise private void OnMyStringChanged(string e) { Action<object, string> handler = MyStringChanged; // thread safeness if (handler != null) { handler(this, e); } } // How to handle myObject.MyStringChanged += (sender, e) => Console.WriteLine(e); 

通常一个PoC项目使用后一种方法。 但是,在专业应用程序中,请注意FX Cop的理由#CA1009: https ://msdn.microsoft.com/en-us/library/ms182133.aspx

genericstypes的问题是,即使DerivedTypeinheritance自BaseType,EventArgs(DerivedType)也不会从EventArgs(BaseType)inheritance。 使用EventArgs(BaseType)将因此阻止稍后使用该types的派生版本。

这个不存在的原因是,最终会发生什么是你实现这个,然后当你去填充T时,你应该创build一个强types明确的属性,作为您的事件arg的数据包的类,但是通过实现的一半,你意识到没有理由你不只是让这个类从EventArgsinheritance,并称之为好。

除非你只是想要一个string或类似于你的数据包的基本types,在这种情况下,在.NET中可能存在EventArgs类的标准,这些标准可以用来实现任何简单的目的。