在泛型泛型类型上指定类型约束

时间:2011-04-03 06:03:28

标签: c# generics

我有一个基于泛型集合的类型,它包含其他泛型类型:

class Collection<T>
{
}

class ItemType<K>
{
}

Collection<ItemType<string>> c = new Collection<ItemType<string>>();

有没有办法为Collection<T>指定约束,使T为任何类型ItemType的{​​{1}}?有这样的假语法:

K

2 个答案:

答案 0 :(得分:3)

根据您的实际需要,您可以:

  class Collection<T>{}
  class ItemTypeCollection<T> : Collection<ItemType<T>>{} 

  class Collection<TContainer,TItem>
       where TContainer : ItemType<TItem>
  {

  }

您选择哪一个取决于ItemType<T>的衍生物是否具有与ItemType<T>不同的界面

还有另外一种可能适合您的方法。但是,它有点复杂。

您可以创建非通用基类或接口,例如IItemType,并使通用类ItemType<T>实现非通用IItemType

然后你可以写

 class Collection<T>
      where T: IItemType{}

然后,如果您的IItemType实施是通用的,则可以创建Collection<ItemType<T>>。如果您尝试制作Collection<T>T未实现IItemType,则无法编译

答案 1 :(得分:3)

试试这个:

class ItemTypeCollection<T, K> : Collection<T> where T : ItemType<K>
{
}