题
我正准备为携带单个参数的事件args创建一个通用的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#是否具有内置语言的相同功能?当C#2.0出来时,我似乎回忆起来的东西,但现在我找不到它。
还是将它放在另一种方式,我必须创建自己的通用ventargs类,还是c#提供一个?谢谢你的帮助。
解决方案
no。你可能想到了 generacicetagcode ,它允许你为任何特定类型的Eventargs定义委托。
我个人不觉得世代古典etagcode非常适合。在我看来,在事件args中用作“有效载荷”的信息应该是自定义类,以使它的使用和预期的属性非常清楚。使用泛型类将阻止您能够将有意义的名称放入到位。(“数据”代表?)
其他提示
我必须说我不明白这里的所有'纯粹主义者'。 即,如果您已经定义了一个包类 - 具有所有细节,属性等 - 为什么hack创建一个额外的不必要的类只是能够遵循事件/ args机制,签名样式? 事情是 - 不是那些在.NET中的一切 - 或者是“遗失”的事情 - 这是'好' - MS已经“纠正”本身多年...... 我会说只是去创造一个 - 就像我做到了 - 因为我需要它就像那样 - 并保存了大量的时间,
您可以找到 DataEventArgs<TData>
在一些不同的Microsoft装配/命名空间,例如 Microsoft.PraTces.prism.Events 。但是,这些是您可能无法在项目中包含自然的名称空间,以便您可以使用自己的实现。
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。
如果您遵循Microsoft EventHandler模式,那么您可以像您建议的那样实现您的派生Eventargs:
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
泛型类型的问题是,即使deriveDype继承自BaseType,EventArgs(deriveDype)不会继承来自EventArgs(BaseType)。因此,使用EventArgs(BaseType)将稍后使用类型的派生版本来防止。
这不存在的原因是因为最终发生的事情是你实现这个问题,然后当你填写t时,你应该创建一个具有强烈键入的明确属性的类,它充当事件的数据包arg,但通过实施你意识到的中途没有理由你不只是让那个类继承从Eventargs并称之为好。
除非您只想要一个字符串或类似于您的数据包的基本情况,