use*_*285 6 c# linq collections derived-class
随意加载你的枪并瞄准,但我想明白为什么你不应该这样做.
我创建了一个自定义类,用于替换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));
}
}
}
Run Code Online (Sandbox Code Playgroud)
这个想法是每当我从这个列表中添加或删除一个项目时,我的绑定事件就会触发,我可以自动处理XML.
这就像一个魅力,到目前为止一切都很好.
但是如何处理object.ToList()和我的派生版本之间的转换?
很多人都说你应该从Collection中衍生出来......为什么?
您应该派生自,Collection<T>因为它旨在允许您覆盖InsertItem,并RemoveItem添加自定义行为,例如您正在做的事情(同样SetItem,在更改现有项目时添加自定义行为).
因此它可以用作IList<T>,任何插入/删除将自动使用自定义.
在您的情况下,任何转换为IList<T>基类的人List<T>都将绕过您的自定义添加/删除功能.
Collection<T>还提供了一个包装现有列表的构造函数.您可以从派生类中公开它以包装生成的列表Enumerable<T>.ToList().
UPDATE
什么是暴露构造函数的语法?
非常简单:
public class ListwAddRemove<T> : Collection<T>
{
public ListwAddRemove<T>()
{
}
public ListwAddRemove<T>(IList<T> list) : base(list)
{
}
... implementation of overrides for InsertItem, SetItem, RemoveItem ...
}
Run Code Online (Sandbox Code Playgroud)
然后使用如下:
IList<SomeType> list = ....ToList();
ListwAddRemove<SomeType> myList = new ListwAddRemove<SomeType>(list);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
163 次 |
| 最近记录: |