Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   class function per Rtti aufrufen (https://www.delphipraxis.net/188248-class-function-per-rtti-aufrufen.html)

ConstantGardener 12. Feb 2016 20:57

Delphi-Version: 5

class function per Rtti aufrufen
 
Hallo zusammen,

ich versuche gerade per Rtti eine class function aufzurufen. Das scheitert aber leider an der fehlenden Instanz bzw. an einer verbotenen Konvertierung zur Laufzeit.

Ich verwende im Moment diese Funktion von PRUZ aber das läuft so leider nicht. Ich will eigentlich nur eine Function mit einem String als Result aufrufen und dann ein class field setzen.

Delphi-Quellcode:
function RttiMethodInvokeEx(const MethodName:string; RttiType : TRttiType; Instance: TValue; const Args: array of TValue): TValue;
var
 Found  : Boolean;
 LMethod : TRttiMethod;
 LIndex : Integer;
 LParams : TArray<TRttiParameter>;
begin
  Result:=nil;
  LMethod:=nil;
  Found:=False;
  for LMethod in RttiType.GetMethods do
   if SameText(LMethod.Name, MethodName) then
   begin
     LParams:=LMethod.GetParameters;
     if Length(Args)=Length(LParams) then
     begin
       Found:=True;
       for LIndex:=0 to Length(LParams)-1 do
       if LParams[LIndex].ParamType.Handle<>Args[LIndex].TypeInfo then
       begin
         Found:=False;
         Break;
       end;
     end;

     if Found then Break;
   end;

   if (LMethod<>nil) and Found then
     Result:=LMethod.Invoke(Instance, Args)
   else
     raise Exception.CreateFmt('method %s not found',[MethodName]);
end;
Hat da wer eine Idee?

himitsu 13. Feb 2016 19:15

AW: class function per Rtti aufrufen
 
Als "Instance" müsste keine Objekt-Instanz (TObject), sondern ein Klassen-Zeiger (TClass) reingegeben werden, denk ich mal.

Schade, daß Emba so blöd/nett war und das "dynamische" generieren von Funktionsdefionitionen etwas erschwert haben, sonst hätte man auch einfach das ganze als "billige" Prozedur, mit einem zusätzlichen Self-Parameter ansprechen können.

ConstantGardener 14. Feb 2016 19:59

AW: class function per Rtti aufrufen
 
Hallo Himitsu,

danke erstmal für den Hinweis. Ich hab das zwischenzeitlich anders umgesetzt (mit einem Dictionary<TClassName,TSQLRecordInfo>, ich suche mir per RTTI alle PoDo's im Programm raus, lese bestimmte Attribute zur Datentabelle (Name, ID, MasterID) aus und checke dann das Datenformat/Fieldliste, setze Insert und Update-Statements zusammen usw. also ein ORM für Arme).

Das Problem ist mit dem Aufruf der Funktion nicht zu Ende. Das setzen einer Class Var ist auch ein Problem da man die Class Var per RTTI nicht findet.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:08 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