繁体   English   中英

.NET(C#)事件 - 自定义EventArgs问题

[英].NET (C#) events - custom EventArgs question

我有许多C#自定义事件与树中选择的项目相关联,然后使用上下文菜单触发对所选项目的某些操作。 我开始为每个自定义事件创建一个单独的基于EventArgs的类,以打包事件的必要数据。

在后视中,我意识到我的大多数(可能是所有)自定义事件都需要至少传递树选择所代表的底层对象列表。 有些事件也可能需要额外的数据。

考虑到这一点,我想知道以下任何一种是否是可接受的做法?

  • 对多个事件使用相同的基于EventArgs的自定义类(那些只需要传递对象列表的事件)。 显然,这应该可行,但似乎脱离了一些用于连接事件机制的推荐命名约定。

  • 创建一个基类,它包装我经常需要的对象列表,然后从中派生其他类,因为需要额外的数据。

  • 也许还有别的什么呢?

目前,我只有少数自定义事件,但需要添加更多。 由于我看到每个事件所需的数据出现了一种模式,我希望在继续之前有一个更好的计划。

谢谢你的建议。

我以前做过这条路。 我第二次想到了一个包含公共数据的基本事件类。 如果没有事件将直接使用它,请将基类设置为内部,以避免向用户公开不必要的对象。 拥有基类还允许您以后添加更多事件数据。 由于该类是内部的,因此它的用户在外部不受更改的影响。

.NET框架中有很多这样的例子。 沿着同样的路线做某事是非常一致的。 这是一对夫妇:

  • System.ComponentModel.ProgressChangedEventArgs (为派生类型提供ProgressPercentageUserState
    • System.Net.DownloadProgressChangedEventArgs
    • System.Net.UploadProgressChangedEventArgs
    • System.Windows.Documents.Serialization.WritingProgressChangedEventArgs
  • System.ComponentModel.CancelEventArgs (将Cancel成员提供给派生类型)
    • Microsoft.VisualBasic.ApplicationServices.StartupEventArgs
    • System.ComponentModel.DoWorkEventArgs
    • System.Configuration.SettingChangingEventArgs
    • System.Drawing.Printing.PrintEventArgs
    • System.Web.UI.WebControls.DetailsViewDeleteEventArgs
    • System.Web.UI.WebControls.DetailsViewInsertEventArgs
    • System.Web.UI.WebControls.DetailsViewModeEventArgs
    • System.Web.UI.WebControls.DetailsViewPageEventArgs
    • System.Web.UI.WebControls.DetailsViewUpdateEventArgs
    • System.Web.UI.WebControls.EntityDataSourceChangingEventArgs
    • 其中 50多个

编辑:

我可能会使用这样的类( 不是抽象的)。

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;

public class CollectionEventArgs<T> : EventArgs
{
    public static readonly CollectionEventArgs<T> Empty = new CollectionEventArgs<T>();

    public CollectionEventArgs(params T[] items)
    {
        this.Items = new ReadOnlyCollection<T>(items);
    }

    public CollectionEventArgs(IEnumerable<T> items)
    {
        this.Items = new ReadOnlyCollection<T>(items.ToArray());
    }

    public ReadOnlyCollection<T> Items
    {
        get;
        private set;
    }
}

我会选择一和二。 创建一个可用于大多数事件的基类,然后从该类派生出需要其他事件的事件。 如果你看看它们构建方式的.NET库。

只需确保使用适当的命名约定即可。 基类不应包含特定事件的名称,只有在一个事件中使用的类才应引用事件的名称。 基类可能包含控件的名称。

你的意思是

public class EventArgs<TValue> : EventArgs
{
    public TValue Value { get; }

    /* ... */
}

在哪里我可以使用任何我喜欢的Value

是的,我很高兴使用这样的东西。 我不认为这是一个问题。

暂无
暂无

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

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