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

Antworten auf die Frage(1)

Ihre Antwort auf die Frage