Delphi Rtti: wie man Objekte aus TObjectList <T> erhält
Ich arbeite an einem benutzerdefinierten Klasse-zu-XML-Konverter und eine der Anforderungen ist die Fähigkeit zum StreamingTObjectList<T>
Felder.
Ich versuche das aufzurufenToArray()
Methode, um an die Objekte der TObjectlist zu gelangen, aber ich erhalte die Meldung "Ungültiger Klassentyp", da die Typen offensichtlich nicht übereinstimmen.
Nehmen Sie diese Klasse zum Beispiel:
type
TSite = class
Name : String;
Address : String;
end;
TSites = class
Sites : TObjecList<TSite>;
end;
Ich muss nur die Site-Objekte aus der Sites-TObjectList abrufen. Bitte denken Sie daran, dass ich RTTI verwende, damit ich den ObjectType in TObjectList nicht kenne.Typecasting wird also nicht funktionieren. Dies ist, was ich habe, aber es scheint eine Sackgasse (Obj istTobjectList<TSite>
Hier):
function TXmlPersister.ObjectListToXml(Obj : TObject; Indent: String): String;
var
TypInfo: TRttiType;
meth: TRttiMethod;
Arr : TArray<TObject>;
begin
Result := '';
TypInfo := ctx.GetType(Obj.ClassInfo);
Meth := TypInfo.GetMethod('ToArray');
if Assigned(Meth) then
begin
Arr := Invoke(Obj, []).AsType<TArray<TObject>>; // invalid class typecast error
if Length(Arr) > 0 then
begin
// get objects from array and stream them
...
end;
end;
Jeder Weg, um die Objekte über RTTI aus der TObjectList zu entfernen, ist gut für mich. Aus irgendeinem Grund werden die GetItem / SetItem-Methoden in TypInfo nicht angezeigt
BEARBEITEN
Dank David habe ich meine Lösung:
function TXmlPersister.ObjectListToXml(Obj : TObject; Indent: String): String;
var
TypInfo: TRttiType;
meth: TRttiMethod;
Value: TValue;
Count : Integer;
begin
Result := '';
TypInfo := ctx.GetType(Obj.ClassInfo);
Meth := TypInfo.GetMethod('ToArray');
if Assigned(Meth) then
begin
Value := Meth.Invoke(Obj, []);
Assert(Value.IsArray);
Count := Value.GetArrayLength;
while Count > 0 do
begin
Dec(Count);
Result := Result + ObjectToXml(Value.GetArrayElement(Count).AsObject, Indent);
end;
end;
end;
Ich bin offen für Vorschläge, vielleicht gibt es 'cleverere' Wege, um dieses Ziel zu erreichen ...