AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Methodenliste für Interface

Ein Thema von Kraisel · begonnen am 12. Sep 2016 · letzter Beitrag vom 13. Sep 2016
Antwort Antwort
Benutzerbild von Kraisel
Kraisel

Registriert seit: 19. Mär 2012
Ort: Bochum-Linden
64 Beiträge
 
Delphi 12 Athens
 
#1

Methodenliste für Interface

  Alt 12. Sep 2016, 13:55
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
Peter Kaisler
Das einzig Komplizierte ist zu begreifen wie einfach es ist.
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Methodenliste für Interface

  Alt 12. Sep 2016, 14:28
Du must das interface in
{$M+} "einpacken"
Fritz Westermann
  Mit Zitat antworten Zitat
Benutzerbild von Kraisel
Kraisel

Registriert seit: 19. Mär 2012
Ort: Bochum-Linden
64 Beiträge
 
Delphi 12 Athens
 
#3

AW: Methodenliste für Interface

  Alt 12. Sep 2016, 17:18
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.
Peter Kaisler
Das einzig Komplizierte ist zu begreifen wie einfach es ist.
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#4

AW: Methodenliste für Interface

  Alt 12. Sep 2016, 17:48
Gar nicht. Gibt keine RTTI für Interface Properties

P.S. if l > 0 then kannste dir sparen, eine for i := 0 to -1 Schleife iteriert genau keinmal.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (12. Sep 2016 um 17:50 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Kraisel
Kraisel

Registriert seit: 19. Mär 2012
Ort: Bochum-Linden
64 Beiträge
 
Delphi 12 Athens
 
#5

AW: Methodenliste für Interface

  Alt 12. Sep 2016, 18:57
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.
Peter Kaisler
Das einzig Komplizierte ist zu begreifen wie einfach es ist.
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#6

AW: Methodenliste für Interface

  Alt 13. Sep 2016, 00:02
Premature optimization.

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.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (13. Sep 2016 um 00:11 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Methodenliste für Interface

  Alt 13. Sep 2016, 07:29
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".
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#8

AW: Methodenliste für Interface

  Alt 13. Sep 2016, 13:14
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.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (13. Sep 2016 um 13:25 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:35 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