c# – 自定义(派生)列表

前端之家收集整理的这篇文章主要介绍了c# – 自定义(派生)列表前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
随意加载你的枪并瞄准,但我想明白为什么你不应该这样做.

我创建了一个自定义类,用于替换List的任何实例(我用它来更新它们后面的XML对象):

public class ListwAddRemove<T> : List<T> {
    public event EventHandler<ListModifyEventArgs> OnAdd;
    public event EventHandler<ListModifyEventArgs> OnRemove;

    new public void Add(T o) {
        base.Add(o);

        if (OnAdd != null) {
            OnAdd(this,new ListModifyEventArgs(o));
        }
    }

    new public void Remove(T o) {
        base.Remove(o);

        if (OnRemove != null) {
            OnRemove(this,new ListModifyEventArgs(o));
        }
    }
}

这个想法是每当我从这个列表中添加删除一个项目时,我的绑定事件就会触发,我可以自动处理XML.

这就像一个魅力,到目前为止一切都很好.

但是如何处理object.ToList()和我的派生版本之间的转换?

很多人都说你应该从Collection中衍生出来……为什么?

解决方法

你应该从Collection< T>派生出来.因为它旨在允许您覆盖InsertItem,而RemoveItem则用于添加自定义行为,例如您正在执行的操作(也是SetItem,以在更改现有项目时添加自定义行为).

因此,它可以用作IList< T>,并且任何插入/移除将自动使用定制.

在你的情况下,任何人都会转向IList< T>或者基类List< T>将绕过您的自定义添加/删除功能.

收集和LT; T>还提供了一个包装现有列表的构造函数.您可以从派生类中公开它以包装由Enumerable< T> .ToList()生成的列表.

UPDATE

Whats the Syntax to expose the constructor please?

非常简单:

public class ListwAddRemove<T> : Collection<T>
{
    public ListwAddRemove<T>()
    {
    }

    public ListwAddRemove<T>(IList<T> list) : base(list)
    {
    }

    ... implementation of overrides for InsertItem,SetItem,RemoveItem ...
}

然后使用如下:

IList<SomeType> list = ....ToList();
ListwAddRemove<SomeType> myList = new ListwAddRemove<SomeType>(list);

猜你在找的C#相关文章