2010-01-26 106 views
2

如何將泛型保存在非泛型對象的泛型TList中?Delphi 2010泛型的泛型

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; 

編譯器說,T沒有在

Attributes: TList<TXmlAttribute<T>>; 

delcared - 皮埃爾雅格爾

回答

2

TXmlNode不知道T是什麼。它應該是什麼?

也許你的意思是:

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

...要麼,或者你需要指定一個類型。

但是,看起來你在這裏錯過了一些東西。泛型允許您爲每種類型創建一個單獨的類 - 不是所有類型的類。在上面的代碼中,TList擁有一組相同的類型,並且您可能希望它們與不同。考慮這個,而不是:

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

    TXmlNode = class 
     Name: String; 
     Attributes: TList<TXmlAttribute>; 
     Nodes: TList<TXmlNode>; 
    end; 
    ... 
    end; 
TXmlBuilder = class 
    type 
    TXmlAttribute= class 
     Name: String; 
     Value: Variant; 
    end; 

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

謝謝,我明白我不能將泛型存儲在通用列表中,因爲存儲類型必須在編譯時已知。感謝您使用變體的建議,但由於我正在爲xml編寫原生delphi類型的(de)序列化程序,如果可能的話,我寧願使用來自Rtti的新TValue。 – ZeDalaye 2010-01-26 11:45:41

+0

@ZeDalaye:如果這就是你想要做的,那麼一定要讀這個:http://stackoverflow.com/questions/368913/whats-a-good-way-to-serialize-delphi-object-tree-對XML的使用,RTTI和 - 不卡斯特 – 2010-01-27 10:17:37