2011-04-03 8 views
1

J'ai un type à base de collection générique qui détient d'autres types génériques:Pour spécifier le type Contraints sur un type générique générique

class Collection<T> 
{ 
} 

class ItemType<K> 
{ 
} 

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

Y at-il un moyen de spécifier les contraintes pour Collection<T> telles que T est un ItemType avec tout type K? Un peu comme cela avec la syntaxe faux:

class Collection<T> where T : ItemType<> 
{ 
} 
+0

mis à jour ma réponse, je pense que la solution à l'interface non-générique est ce que vous sont après – smartcaveman

Répondre

3

Eh oui

Selon ce que vous avez réellement besoin, vous pouvez faire:

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

ou

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

    } 

Lequel vous choisissez dépend si les dérivées de ItemType<T> ont des interfaces différentes de ItemType<T>

Il existe une autre approche qui pourrait fonctionner pour vous. Mais, c'est un peu plus compliqué.

Vous pouvez créer une classe de base non-générique ou de l'interface, comme IItemType et faire la classe générique ItemType<T> mettre en œuvre que IItemType non générique.

Ensuite, vous pouvez écrire

class Collection<T> 
     where T: IItemType{} 

Ensuite, si est générique, votre IItemType mise en œuvre, vous pouvez créer un Collection<ItemType<T>>. Si vous essayez de faire un Collection<T> et T ne met pas en œuvre IItemType, alors il ne sera pas compilé

3

Essayez ceci:

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