如何在.NET 2.0中创建自定义集合

时间:2009-07-28 05:08:12

标签: c# wcf generics datagridview

您好我想创建自定义集合,我从CollectionBase类派生我的自定义集合类,如下所示:

public class MyCollection : System.Collectio.CollectionBase
{
    MyCollection(){}
    public void Add(MyClass item)
    {
        this.List.Add(item);
    }
}

class MyClass
{
    public string name;
}

让我问几个问题:

  1. 当我使用.NET 3.5框架时,这种方法是否正确和新。
  2. 我想从我的网络服务(WCF)公开这个集合。我该怎么做?
  3. 我是否必须实施GetEnumerator?
  4. 这是否会绑定到DataGridView。

5 个答案:

答案 0 :(得分:6)

List<T>派生有点无意义,尤其现在它具有IEnumerable<T>构造函数和扩展方法的可用性。除了EqualsGetHashCodeToString之外,它没有可以覆盖的虚拟方法。 (如果你的目标是为列表实现Java的toString()功能,我想你可以从List<T>派生。)

如果要创建自己的强类型集合类并可能在添加/删除项时自定义集合行为,则需要从新的(到.NET 2.0)类型派生System.Collections.ObjectModel.Collection<T>,受保护的虚拟方法,包括InsertItemRemoveItem,您可以覆盖这些方法以在这些时间执行操作。请务必阅读文档 - 这是一个非常简单的类,但您必须了解public / non-virtual和protected / virtual方法之间的区别。 :)

public class MyCollection : Collection<int>
{
    public MyCollection()
    {
    }

    public MyCollection(IList<int> list)
        : base(list)
    {
    }

    protected override void ClearItems()
    {
        // TODO: validate here if necessary
        bool canClearItems = ...;
        if (!canClearItems)
            throw new InvalidOperationException("The collection cannot be cleared while _____.");

        base.ClearItems();
    }

    protected override void RemoveItem(int index)
    {
        // TODO: validate here if necessary
        bool canRemoveItem = ...;
        if (!canRemoveItem)
            throw new InvalidOperationException("The item cannot be removed while _____.");

        base.RemoveItem(index);
    }
}

答案 1 :(得分:4)

我认为你最好使用System.Collections.Generic中定义的容器类之一

  1. 当我在.NET 3.5框架上工作时,这种方法是否正确和新。
    • 否。使用List或其他东西。
  2. 我想从我的网络服务(WCF)中公开这个集合。我该怎么做?
    • 通。没有使用过WCF。
  3. 我必须实现GetEnumerator吗?
    • 如果您使用标准System.Collections.Generic容器类之一,则不会。它已经为你完成了
  4. 这是否会绑定到DataGridView。
    • 任何支持IEnumerable的标准集合都会很好地绑定到控件。如果要进行排序和过滤,可以使用IBindingListView。

答案 2 :(得分:3)

如果你想要自己的集合类,你也可以从泛型集合继承到非泛型类,例如:

public class MyCollection : List<MyClass>
{

}

这样您就可以获得列表的所有功能(例如)。你只需要添加一些构造函数。

答案 3 :(得分:1)

为什么不使用通用集合?

using System;
using System.Collections.Generic;

namespace Test {
    class MyClass { 
    }
    class Program {
        static void Main(string[] args) {
            // this is a specialized collection
            List<MyClass> list = new List<MyClass>();
            // add elements of type 'MyClass'
            list.Add(new MyClass());
            // iterate
            foreach (MyClass m in list) { 
            }
        }
    }
}

编辑:Ashu,如果您想对添加和删除操作进行一些验证,您可以使用通用集合作为专门集合的成员:

using System;
using System.Collections.Generic;
namespace Test {
    class MyClass { 
    }
    class MyClassList {
        protected List<MyClass> _list = new List<MyClass>();
        public void Add(MyClass m) { 
            // your validation here...
            _list.Add(m);
        }
        public void Remove(MyClass m) {
            // your validation here...
            _list.Remove(m);
        }
        public IEnumerator<MyClass> GetEnumerator() {
            return _list.GetEnumerator();
        }
    }
    class Program {
        static void Main(string[] args) {
            MyClassList l = new MyClassList();
            l.Add(new MyClass());
            // iterate
            foreach (MyClass m in l) { 
            }
        }
    }
}

答案 4 :(得分:0)

也许我在这里遗漏了一些内容,但如果您只是需要添加验证,为什么不从通用集合继承并覆盖New() Remove()或任何其他方法。

class CustomeCollection<T> : List<T>
{
    public new void Add(T item)
    {
        //Validate Here
        base.Add(item);
    }

    public new void Remove(T item)
    {
        //Validate Here
        base.Remove(item);
    }

}