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!
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.