Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Generische Funktion mit RTTI aufrufen (https://www.delphipraxis.net/195721-generische-funktion-mit-rtti-aufrufen.html)

Relicted 20. Mär 2018 09:43

Delphi-Version: 10.2 Tokyo

Generische Funktion mit RTTI aufrufen
 
Hallo zusammen,

ich versuche mich gerade an einer JsonToObject Funktion. Ich hänge aber aktuell an der Stelle, dass ich mehrere TObjectList<T> Instanzen in den Klassen habe. Ich versuche mal es zusammenzufassen:
Delphi-Quellcode:
class function TJsonRttiHelper.JsonToObj<T>(AJson: ISuperObject): T;
// ...
begin
  // ..
  // prüfung ob es sich um eine generische liste handelt..
  if IsGenericList(myprop.GetValue(lObj).AsObject.ClassType) then
  begin
    // instanz der TObjectList<T>, lList : TObject;
    lList := myprop.GetValue(lObj).AsObject;
    // Add methode der TObjectList<T> um sie später aufzurufen  
    proptype := c.GetType(lList.ClassInfo) as TRttiInstanceType;
    meth := proptype.GetMethod('Add');
    // GetGenericDataTypeName gibt den FQ-Namen des "T" zurück. Also z.B. "MeineDatenunit.TMeinDatentyp"
    //lListObj := (c.FindType(GetGenericDataTypeName(myprop.GetValue(lObj).AsObject.ClassType)) as TRttiInstanceType).MetaClassType.Create;


    // Hier liegt das Problem. Ich versuche die funktion hier rekursiv aufzurufen, weiß aber nicht genau wie ich "TMeinDatentyp" an die Funktion übergeben kann.
    //lListObj := JsonToObj<(c.FindType(GetGenericDataTypeName(myprop.GetValue(lObj).AsObject.ClassType)) as TRttiInstanceType).ClassParent>(itmval);

    lListObj := JsonToObj<{HILFE, was muss hier rein? :(}>(itmval);

    // aufruf der methode..
    meth.Invoke(lList, [lListObj]);
  end;
end;
Die Frage ist also, wass an die Stelle rein muss, oder ob es überhaupt möglich ist.

Delphi-Quellcode:
lListObj := JsonToObj<{????}>(itmval);

Stevie 20. Mär 2018 10:03

AW: Generische Funktion mit RTTI aufrufen
 
Nein, das geht nicht.

Du müsstest den Code aus TJson.JsonToObject<T> nehmen und in in eine nicht generische Methode verpacken - das geht hier recht einfach, weil JsonToObject nicht noch weiter generischen Code aufruft, sondern T bloß als TClass weiter an CreateObject gibt.

P.S. Ich bin hier von System.REST.Json ausgegangen, wie das mit SuperObject aussieht weiß ich nicht, wird aber ähnlich sein.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:21 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz