2010-01-26 6 views
2

Comment stocker des génériques dans un TList générique détenu par un objet non générique?Delphi 2010 Génériques de génériques

type 
    TXmlBuilder = class 
    type 
    TXmlAttribute<T>= class 
     Name: String; 
     Value: T; 
    end; 

    TXmlNode = class 
     Name: String; 
     Attributes: TList<TXmlAttribute<T>>; 
     Nodes: TList<TXmlNode>; 
    end; 
    ... 
    end; 

Le compilateur dit T n'est pas delcared dans

Attributes: TList<TXmlAttribute<T>>; 

- Pierre Yager

Répondre

2

TXMLNode ne sait pas ce que T est. Qu'est ce que c'est censé être?

Peut-être que vous vouliez dire:

TXmlNode<T> = class 
    Name: String; 
    Attributes: TList<TXmlAttribute<T>>; 
    Nodes: TList<TXmlNode<T>>; 
end; 

... que ce soit, ou vous devez spécifier un type.

Cependant, il semble qu'il vous manque quelque chose ici. Les génériques vous permettent de créer une classe distincte pour chaque type - pas une classe pour tous les types. Dans le code ci-dessus, TList contient un tableau de types qui sont le même, et vous voulez probablement les différents. Considérez ceci à la place:

TXmlBuilder = class 
    type 
    TXmlAttribute= class 
     Name: String; 
     Value: Variant; 
    end; 

    TXmlNode = class 
     Name: String; 
     Attributes: TList<TXmlAttribute>; 
     Nodes: TList<TXmlNode>; 
    end; 
    ... 
    end; 
+0

Merci, je comprends que je ne peux pas stocker de génériques dans une liste générique parce que le type stocké doit être connu au moment de la compilation. Merci pour votre suggestion sur l'utilisation des variantes mais comme j'écris un (de) sérialiseur pour les types delphi natifs de/vers xml, je préférerais utiliser la nouvelle version de TVti de Rtti si possible. – ZeDalaye

+0

@ZeDalaye: si c'est ce que vous voulez faire, alors assurez-vous de lire aussi ceci: http://stackoverflow.com/questions/368913/whats-a-good-way-to-serialize-delphi-object-tree- to-xml-using-rtti-et-non-cust –