Frage

Ich versuche, Objekte zu XML in Delphi zu analysieren, so las ich über die Objektclass Methode aufrufen seine RTTI Informationen zu erhalten.

Die Sache ist, das offenbar nur für TPersistent Objekte funktioniert. Ansonsten muss ich speziell eine Compiler-Direktive {$ M +} zum Quellcode einfügen für den Compiler RTTI Info zu erzeugen.

Also ich glücklich die Richtlinie aufgenommen, nur das zu finden, auch wenn es etwas aus dem Classzurückrufen hat (es verwendete Null zurückzukehren), jetzt kann ich nicht die Klasse abzurufen Eigenschaften, Felder oder Methoden von ihm. Es ist wie es das Objekt leer erstellt.

Jede Idee, was ich hier fehlt? Dank!

War es hilfreich?

Lösung

Haben legen Sie diese Eigenschaften und Methoden in den published Abschnitt?

Außer dem 'klassischen' RTTI ($ TYPEINFO ON) finden Sie nur Informationen über Eigenschaften erhalten, nicht auf Methoden. Sie müssen 'erweiterte' RTTI ($ METHOD ON) für die.

Guter Ausgangspunkt für ausgedehnte RTTI: David Glassborow auf erweiterten RTTI

(wer würde glauben, dass gerade in dieser Minute beendete ich einige Code zu schreiben, der erweiterte RTTI benutzt und beschlossen, die Stack-Überlauf ein wenig durchsuchen:))

Andere Tipps

RTTI wird nur zeigen Sie auf veröffentlicht Eigenschaften usw. -. Nicht nur öffentlich diejenigen

Versuchen Sie Ihren Code mit einem TObject und sehen, was passiert -. Wenn das nicht funktioniert, Code schreiben , weil nicht jeder psychischen ist

Haben Sie darüber nachgedacht, die TXMLDocument Komponente? Es wird in der XML-suchen und dann eine schöne Einheit von Delphi-Klassen erstellen, die XML-Datei darstellt -. Macht es wirklich, wirklich einfach XML-Dateien lesen und schreiben

Wie für das RttiType Problem nur Null zurückkehrt, in diesem Fall wahrscheinlich aus einem Grunde: in Ihrem Test, können Sie nicht die Klasse jederzeit instanziiert haben. Der Compiler, weil es nie einen Verweis auf diese Klasse hat (weil es keine Instanz überhaupt ist), entfernt einfach aus der Information als eine Form der Optimierung. Siehe die beiden Beispiele unten. Das Verhalten ist anders, wenn Sie die Klasse an einem bestimmten Punkt in Ihrem Code instanziiert haben oder nicht.

Nehmen wir die folgende Klasse:

type
  TTest = class
  public
    procedure Test;
  end;

und der folgende Code unter:

var
  LContext: TRttiContext;
  LType: TRttiType;
  LTest: TTest;
begin
  LContext := TRttiContext.Create;
  for LType in LContext.GetTypes do
  begin
    if LType.IsInstance then
    begin
      WriteLn(LType.Name);
    end;
  end;
end;

Bisher sind TTest Klasse Informationen zur Verwendung von RTTI nicht zur Verfügung. Wenn wir jedoch an einem bestimmten Punkt in der Anwendung zu erstellen, wird eine Referenz für die es in der Kompilierung erstellt wird, die diese Informationen zur Verfügung stellt:

var
  LContext: TRttiContext;
  LType: TRttiType;
  LTest: TTest;
begin
  LTest := TTest.Create; //Here i´m using TTest.
                         //Could be in another part of the program

  LContext := TRttiContext.Create;
  for LType in LContext.GetTypes do
  begin
    if LType.IsInstance then
    begin
      WriteLn(LType.Name);
    end;
  end;
end;

An diesem Punkt, wenn Sie mit LContext.FindType ( ‚TTest‘) , wird es keine Fehlanzeige, da die Compiler Verweis auf die Klasse gehalten. Dies erklärt das Verhalten, das Sie wurden in den Tests mit.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top