![]() |
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:
Hat jemand eine Idee??
//==============================================================================
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; Danke |
AW: Methodenliste für Interface
Du must das interface in
{$M+} "einpacken" |
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. |
AW: Methodenliste für Interface
Gar nicht. Gibt keine RTTI für Interface Properties
P.S.
Delphi-Quellcode:
kannste dir sparen, eine
if l > 0 then
Delphi-Quellcode:
Schleife iteriert genau keinmal.
for i := 0 to -1
|
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 |
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. |
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". |
AW: Methodenliste für Interface
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz