Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Methodenliste für Interface (https://www.delphipraxis.net/190206-methodenliste-fuer-interface.html)

Kraisel 12. Sep 2016 12:55

Methodenliste für Interface
 
Hallo,

meine ClassFactory erzeugt eine Crossverweisliste, die angibt, welches Interface in welcher Klasse und welche KLassen die einzelnen Interface implementieren. Mit den Klassen liste ich b.B. auch noch die Methoden und die Properties auf. Das würdeich gerne auch für die Interfaces machen.

Bei Interfaces funktioniert folgender Code aber nicht, obwohl es laut Doku eigentlich gehen sollte.

Delphi-Quellcode:
//==============================================================================
function GetRttiMethods (aInfo: PTypeInfo): TArray<String>;
//==============================================================================
var mContext: TRttiContext;
    mMethods: TArray<TRttiMethod>;
    i, l: Integer;
begin
  mContext := TRttiContext.Create;
  mMethods := mContext.GetType (aInfo).GetMethods ();
  l := Length (mMethods);  // mit l bei keinem oder wenigen Einträgen deutlich schneller
  SetLength (Result, l);  
  if l > 0 then for i := 0 to l - 1 do Result[i] := mMethods[i].Name;
  mContext.Free;
end;

//==============================================================================
var
  mList: TArray<String>;
begin
  mList := GetRttiMethods (TypeInfo (TMyObject));   // OK
  mList := GetRttiMethods (TypeInfo (TMyRecord));   // OK
  mList := GetRttiMethods (TypeInfo (IMyInterface)); // NG, Liste bleibt leer ???
end;
Hat jemand eine Idee??
Danke

Fritzew 12. Sep 2016 13:28

AW: Methodenliste für Interface
 
Du must das interface in
{$M+} "einpacken"

Kraisel 12. Sep 2016 16:18

AW: Methodenliste für Interface
 
Ja super, danke,

mit Methoden klappts jetzt wunderbar. Aber wie bekomme ich die Properties. In meinem Algorithmus einfach Methods duch Properties ersetzen funktioniert für Records und Klassen einwandfrei, für Interface trotz {$M+} leider immer noch NICHT.

Stevie 12. Sep 2016 16:48

AW: Methodenliste für Interface
 
Gar nicht. Gibt keine RTTI für Interface Properties

P.S.
Delphi-Quellcode:
if l > 0 then
kannste dir sparen, eine
Delphi-Quellcode:
for i := 0 to -1
Schleife iteriert genau keinmal.

Kraisel 12. Sep 2016 17:57

AW: Methodenliste für Interface
 
Danke für den Hinweis.

Natürlich auch ohne if l > 0, ... aber eben wesentlich langsamer, vor Allem, wenn Bereichsüberwachung und/oder Überlaufprüfung aktiv ist! Und da die Liste, vor Allem bei beliebigen Typen, häufig leer ist, lohnt sich die Abfrage. Ist aber sicherlich eine Frage meiner Zeitpendanterie oder auch Geschmacksache. :-D

Stevie 12. Sep 2016 23:02

AW: Methodenliste für Interface
 
Premature optimization. :-D

Nicht jedes mal den RTTI Context zu erstellen bringt zigmal so viel Speed, wie ne handvoll assembler Instruktionen zu sparen.

Und wenn du bei Typen, die nicht vom TypeKind tkClass, tkRecord oder tkInterface sind, gleich mit Exit(nil) rausgehst, sparste noch mehr.

jaenicke 13. Sep 2016 06:29

AW: Methodenliste für Interface
 
Der Grund, dass es die Properties bei Interfaces nicht als Liste gibt, ist auch sehr einfach:
Interfaces sind in Delphi den COM-Interfaces nachempfunden und die kennen keine Properties. Daher gibt es diese real auch nicht, sondern Zugriffe auf die Properties werden direkt auf die Getter und Setter gemappt. Die Properties sind nur "syntactic sugar".

Stevie 13. Sep 2016 12:14

AW: Methodenliste für Interface
 
Zitat:

Zitat von jaenicke (Beitrag 1347491)
Der Grund, dass es die Properties bei Interfaces nicht als Liste gibt, ist auch sehr einfach:
Interfaces sind in Delphi den COM-Interfaces nachempfunden und die kennen keine Properties. Daher gibt es diese real auch nicht, sondern Zugriffe auf die Properties werden direkt auf die Getter und Setter gemappt. Die Properties sind nur "syntactic sugar".

Der Grund ist nur fadenscheinig. Mit der enhanced RTTI hätte man ohne Mühe Einträge in der RTTI dafür erzeugen können, ähnlich den Einträgen für Eigenschaften bei Objekten, hinter denen Getter und Setter stecken. Für Records gibts auch keine Properties.


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