65.9K
CodeProject 正在变化。 阅读更多。
Home

SmartLists - 带事件的扩展列表

starIconstarIconstarIconstarIconemptyStarIcon

4.00/5 (2投票s)

2010年9月29日

BSD

2分钟阅读

viewsIcon

18454

downloadIcon

143

SmartLists 库是扩展标准 C# List 对象的类集合。

引言

SmartLists 库是一组扩展标准 C# List<T> 对象的类。 更好地说:它们实现了 IList<T> 接口,包装了 List<T> 对象并为其添加了更多功能。

这些列表实现了针对处理 List 时通常会发生的一些常见问题的解决方案。例如,一个具有 "Parent" 对象的列表,该对象在列表元素和列表本身之间保持一致更新。

这些列表的设计并非为了性能,而是为了易用性和一致性。如果您追求性能,最好考虑为性能而设计的其他类型的列表。

EventList

这是一个在添加、插入、删除、交换元素以及清除时生成事件的列表。事件在这些操作之前和之后生成,以便我们可以取消操作或在操作之后采取进一步的操作。

一些事件使用的例子可能是

  1. 在将对象添加到列表中之前检查对象,以便不将具有不一致属性的对象添加到列表中
  2. 为了避免某些类型的元素从列表中删除
  3. 在对列表执行某些操作后更新 GUI 元素

NamedList

这是一个 EventList,要求其元素具有 Name (string) 属性 (INamed 接口)。在这种列表中,您不能添加同名的元素。名称比较可以设置为区分大小写或不区分大小写。

/// <summary>
/// Object that have a Name (property)
/// </summary>
public interface INamed
{
    /// <summary>
    /// Event fired before the Name of the object is changed
    /// Operation can be cancelled
    /// </summary>
    event CancelRenameEventHandler BeforeNameChanged;
    /// <summary>
    /// Event fired when the object has changed it's Name
    /// </summary>
    event EventHandler NameChanged;
    /// <summary>
    /// Name of the object
    /// </summary>
    string Name { get; }
}

ParentedList

这是一个 EventList,其元素和列表本身都具有一个 Parent 对象 (IParented<T> 接口)。并且我们希望在对象从列表中添加或删除或列表的 parent 更改时自动更新此 Parent 属性。这确实是一个非常常见的情况,经常发生,并且通常以最错误和不一致的方式进行编码。

/// <summary>
/// Objects implementing this interface have a parent object
/// </summary>
/// <typeparam name="T">Type of the parent object</typeparam>
public interface IParented<T>
{
    /// <summary>
    /// Event generated when the Parent property is changed
    /// </summary>
    event EventHandler ParentChanged;
    /// <summary>
    /// Get or set the Parent object
    /// </summary>
    T Parent
    {
        get;
        set;
    }
}

ParentedNamedList

这是一个 EventList,它将 NamedListParentedList 的功能放在一起。因此,在这种列表中,我们将有带有 NameParent 属性的项。

此类型列表的一个使用示例是数据库表字段的列表。这些字段当然具有 NameParent(表)。当一个字段被删除或创建并添加到列表中时,它的父级会自动由列表更新。当然,您不能添加两个同名字段:当然,您不能使用另一个字段的名称重命名一个字段(这将生成一个 DuplicatedNameException)。所有这些都由 ParentedNamedList 自动处理。开发人员唯一需要做的是创建一个实现 INamedIParent<T> 接口的 Field 对象。

© . All rights reserved.