繁体   English   中英

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

[英]Does .NET have a built-in EventArgs<T>?

我准备为带有单个参数的事件 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 出现时遇到过类似的事情,但现在我找不到了。

或者换句话说,我必须创建自己的通用 EventArgs 类,还是 C# 提供一个? 谢谢你的帮助。

不。您可能正在考虑EventHandler<T> ,它允许您为任何特定类型的 EventArgs 定义委托。

不过,我个人认为EventArgs<T>不太合适。 在我看来,在事件 args 中用作“有效负载”的信息应该是一个自定义类,以使其用法和预期属性非常清楚。 使用泛型类将阻止您将有意义的名称放在适当的位置。 (“数据”代表什么?)

我必须说我不理解这里所有的“纯粹主义者”。 即如果你已经定义了一个包类——它具有所有的细节、属性等——为什么黑客创建一个额外的不必要的类只是为了能够遵循事件/参数机制,签名风格? 事情是 - 并非 .NET 中的所有内容 - 或者就此“缺失” - 是“好” - MS 多年来一直在“纠正”自己......我想说只是去创建一个 - 就像我做的那样- 因为我就像那样需要它 - 并为我节省了很多时间,

它确实存在。 至少,现在是这样。

您可以在一些不同的 Microsoft 程序集/命名空间中找到DataEventArgs<TData> ,例如Microsoft.Practices.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));
    }
}

// 最后你可以订阅你的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 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 警察的理由 #CA1009: https ://msdn.microsoft.com/en-us/library/ms182133.aspx

泛型类型的问题在于,即使 DerivedType 继承自 BaseType,EventArgs(DerivedType) 也不会继承自 EventArgs(BaseType)。 因此,使用 EventArgs(BaseType) 将防止以后使用该类型的派生版本。

这不存在的原因是因为最终会发生的是你实现了这个,然后当你去填写 T 时,你应该创建一个具有强类型明确属性的类,作为事件 arg 的数据包,但是实施到一半时,您意识到没有理由不让该类继承 EventArgs 并称其为好的。

除非您只想要一个字符串或类似的基本数据包,在这种情况下,.NET 中可能有 EventArgs 类标准,它们旨在满足您所达到的任何简单目的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM