2009-12-17 4 views
4

J'ai une classe que je remplirai de la base de données:Collection générique de classes génériques?

public class Option<T> 
{ 
    public T Value { get; set; } 
    public T DefaultValue { get; set; } 
    public List<T> AvailableValues { get; set; } 
} 

Je veux avoir une collection d'entre eux:

List<Option<T>> list = new List<Option<T>>(); 
Option<bool> TestBool = new Option<bool>(); 
TestBool.Value = true; 
TestBool.DefaultValue = false; 
list.Add(TestBool); 
Option<int> TestInt = new Option<int>(); 
TestInt.Value = 1; 
TestInt.DefaultValue = 0; 
list.Add(TestInt); 

Il ne semble pas fonctionner. Des idées?

+0

Avez-vous une exception? –

+0

Pourriez-vous élaborer sur "ça ne semble pas fonctionner?" – iandisme

+0

@Dave, iandisme: Il ne sera pas compilé. "Le type ou le nom de l'espace de nom 'T' n'a pas pu être trouvé (manque-t-il une directive using ou une référence d'assembly?)" –

Répondre

12

Je suppose que vous voulez vraiment une classe de base non générique - sinon il n'y a rien de commun entre les différents types fermés Option<T>.

Je comprends ce que vous essayez de faire, mais les génériques .NET ne vous permettent pas d'exprimer cette relation. Il est comme essayer de faire une carte de Type à une instance de ce type ... il ne vient pas voler :(

7

Vous devez fournir un type au lieu de votre paramètre de modèle:

List<Option<T>> list = new List<Option<T>>();

devient

List<Option<bool>> list = new List<Option<bool>>();

Ajout d'éléments de type Option<int> à cette même liste ne fonctionnera pas, mais qui est une question distincte que ce que j'ai abordé ci-dessus.

0

Première ligne, vous devez dire quel type T est.

List<Option<bool>> list = new List<Option<bool>>(); 

Et vous ne pouvez pas mettre cette TestInt dans cette liste ...

0

Qu'est-ce que vous faites fonctionne uniquement avec des listes hétérogènes.

List<T> est une liste homogène de type T, ce qui signifie tous éléments doivent être de type T. Parce que Option<bool> et Option<int> n'ont pas d'ancêtre commun autre que object, vous ne pouvez pas faire cela à moins d'utiliser un List<object> ou l'ancien ArrayList, qui agissent tous deux comme des listes hétérogènes.

Pensez à récupérer des objets de cette liste:

list.Add(TestBool); 
list.Add(TestInt); 

for(int i = 0; i < list.Count; i++) 
{ 
    list[i].Value // <- what's the type of this? 
} 
Questions connexes