SmartLists - 带事件的扩展列表





4.00/5 (2投票s)
SmartLists 库是扩展标准 C# List 对象的类集合。
引言
SmartLists
库是一组扩展标准 C# List<T>
对象的类。 更好地说:它们实现了 IList<T>
接口,包装了 List<T>
对象并为其添加了更多功能。
这些列表实现了针对处理 List
时通常会发生的一些常见问题的解决方案。例如,一个具有 "Parent
" 对象的列表,该对象在列表元素和列表本身之间保持一致更新。
这些列表的设计并非为了性能,而是为了易用性和一致性。如果您追求性能,最好考虑为性能而设计的其他类型的列表。
EventList
这是一个在添加、插入、删除、交换元素以及清除时生成事件的列表。事件在这些操作之前和之后生成,以便我们可以取消操作或在操作之后采取进一步的操作。
一些事件使用的例子可能是
- 在将对象添加到列表中之前检查对象,以便不将具有不一致属性的对象添加到列表中
- 为了避免某些类型的元素从列表中删除
- 在对列表执行某些操作后更新 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
,它将 NamedList
和 ParentedList
的功能放在一起。因此,在这种列表中,我们将有带有 Name
和 Parent
属性的项。
此类型列表的一个使用示例是数据库表字段的列表。这些字段当然具有 Name
和 Parent
(表)。当一个字段被删除或创建并添加到列表中时,它的父级会自动由列表更新。当然,您不能添加两个同名字段:当然,您不能使用另一个字段的名称重命名一个字段(这将生成一个 DuplicatedNameException
)。所有这些都由 ParentedNamedList
自动处理。开发人员唯一需要做的是创建一个实现 INamed
和 IParent<T>
接口的 Field
对象。