C#基类,用于泛型类的“组”

时间:2015-02-27 12:19:25

标签: c# .net generics

是否有类似泛型类的基类?

我想要这样的东西

public class MyCollection<T> where T : MyBaseObject 
{
  void Add(MyBaseObject obj)
  {
    /* cast to T and insert */
  }

  int Count
  {
    get
    {
      /* count something */
    }
  }
}

public class MyCollectionCollection
{
  Dictionary<Type, MyCollection> collections = new Dictionary<Type, MyCollection>();

  Add(MyBaseObject obj)
  {
    collections[obj.GetType()].Add(obj);
  }
}

MyCollectionCollection包含MyBaseObject的(已知)子类,它们存储在特定于类型的集合中。

Dictionary<Type, MyCollection>无效。我必须定义一个接口IMyCollection。但是,我必须将每个方法都放入MyCollection<T>并进入IMyCollection,这似乎有点多余。而且我必须编写一个getter / setter来替换MyCollection<T>.Count之类的字段,这些字段似乎很臃肿。

修改 public void Add(T obj)中的MyCollection<T>是我的第一次尝试,但我不知道如何在MyCollectionCollection中使用它。 Dictionary<Type, MyCollection> collections无效(CS0305)。我需要一个所有MyCollection<T>的基类,它有Add(T element)

1 个答案:

答案 0 :(得分:1)

如果你有这个:

public class MyCollection<T> where T : MyBaseObject 
{
    public void Add(MyBaseObject obj)
    {
        /* cast to T and insert */
    }
}

然后我有了这个:

public class ConcreteA : MyBaseObject
{
}

public class ConcreteB : MyBaseObject
{
}

我可以写这段代码:

var myCollection = new MyCollection<ConcreteA>();
var b = new ConcreteB();
myCollection.Add(b);

明显不符合/* cast to T and insert */要求。

如果你这样实现它就可以了:

public class MyCollection<T> where T : MyBaseObject 
{
    public void Add(T obj)
    {
        /* no need to cast to T, just insert */
    }
}