我正准备为携带单个参数的事件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 。但是,这些是您可能无法在项目中包含自然的名称空间,以便您可以使用自己的实现。

如果你选择不使用 prism ,但仍想尝试一个通用 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。 如果您遵循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并称之为好。

除非您只想要一个字符串或类似于您的数据包的基本情况,

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top