2 Stimmen

Delphi 2010 Generika von Generika

Wie kann ich Generika in einer generischen TListe speichern, die von einem nicht-generischen Objekt gehalten wird?

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;

Der Compiler sagt, dass T nicht in

Attributes: TList<TXmlAttribute<T>>;

-- Pierre Yager

2voto

Kornel Kisielewicz Punkte 53256

TXmlNode weiß nicht, was T ist. Was soll es denn sein?

Vielleicht meinten Sie:

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

... entweder das, oder Sie müssen einen Typ angeben.

Es scheint jedoch, dass Sie hier etwas übersehen. Generics erlauben es Ihnen, für jeden Typ eine eigene Klasse zu erstellen - nicht eine Klasse für alle Typen. In dem obigen Code enthält TList ein Array von Typen, die derselbe und Sie wollen sie wahrscheinlich verschiedene . Überlegen Sie stattdessen Folgendes:

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

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

0 Stimmen

Danke, ich verstehe, dass ich keine Generika in einer generischen Liste speichern kann, weil der gespeicherte Typ zur Kompilierzeit bekannt sein muss. Vielen Dank für Ihren Vorschlag über die Verwendung von Varianten, aber da ich einen (de)serializer für native Delphi-Typen zu/von xml schreibe, würde ich es vorziehen, den neuen TValue von Rtti zu verwenden, wenn möglich.

0 Stimmen

@ZeDalaye: Wenn Sie das tun wollen, dann sollten Sie auch das hier lesen: stackoverflow.com/questions/368913/

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X