Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Annotationen auslesen (https://www.delphipraxis.net/187124-annotationen-auslesen.html)

amoibos 29. Okt 2015 14:58

Delphi-Version: XE7

Annotationen auslesen
 
Im Buch/Blog von Nick Hodges werden Attribute als Meta-Daten für RTTI genutzt. Daraus wollte ich Annotationen ableiten, d.h. in meinem Beispiel übergebe man ein Objekt, filtert die Methoden und extrahiert den angegebenen Wert. Nur irgendwie scheint er nichts finden zu wollen. Ein wenig Code zur Veranschaulichung:

Delphi-Quellcode:
blublub(Instance : TObject);
var
  Context: TRTTIContext;
  ObjectType: TRttiType;
  Methods: TArray<TRttiMethod>;
  Attribute: TCustomAttribute;
  i: integer;
  ModuleState: TScheduleStates; //Enum
begin
  ObjectType := Context.getType(Instance.ClassType);
  Methods := ObjectType.GetMethods;
  for i := Low(Methods) to High(Methods) do
  begin
    for Attribute in Methods[i].GetAttributes do
    begin
      if not (Attribute is TBaseState) then continue;
      ModuleState := TBaseState(Attribute).State;
[...]
Als Instance wird das Objekt übergeben und die unterschiedlichen Klassen werden von TBaseState abgeleitet, welche zus. noch ein Attribut ModuleState besitzen.
In der Praxis iteriert er nur über i, ins innere der zweiten For-Schleife kommt er gar nicht, jemand eine Idee woran das liegt? Leider ist der Kram im Debugger äußerst schwer zu lesen um daraus was abzuleiten.

Der schöne Günther 29. Okt 2015 15:01

AW: Annotationen auslesen
 
Ohne es ausprobiert zu haben, aber: Ja, TRttiContext ist ein Record. Doch irgendeinen Sinn wird TRttiContext.Create() schon haben. Ich benutze es jedenfalls immer ohne seinen Sinn zu hinterfragen...

Uwe Raabe 29. Okt 2015 15:20

AW: Annotationen auslesen
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1320129)
Ohne es ausprobiert zu haben, aber: Ja, TRttiContext ist ein Record. Doch irgendeinen Sinn wird TRttiContext.Create() schon haben. Ich benutze es jedenfalls immer ohne seinen Sinn zu hinterfragen...

Auch ein Record muss erstmal initialisiert werden. Das Create ist also unerlässlich. Auf das Free könnte man verzichten, aber schaden tut es auch nicht.

amoibos 29. Okt 2015 15:24

AW: Annotationen auslesen
 
Bei Create müsste man dann auch irgendwann einen Typ angeben sonst läuft der Typ-Selektor doch ins Leere?
(Soweit ich das verstanden haben, wird das mittels Serialisierung des Objektes gelöst, deshalb brauchts auch einen Typen.)
Das wird bei mir über Context.GetType gemacht. In seinen Beispielen hat er nie ein Create gebraucht.

Der schöne Günther 29. Okt 2015 15:30

AW: Annotationen auslesen
 
Kannst du denn einmal ein lauffähiges Minimalbeispiel posten? Weil eigentlich ist es doch nur halb so wild und sollte eigentlich klappen so wie du es runterschreibst...

Uwe Raabe 29. Okt 2015 16:29

AW: Annotationen auslesen
 
Zitat:

Zitat von amoibos (Beitrag 1320133)
Bei Create müsste man dann auch irgendwann einen Typ angeben sonst läuft der Typ-Selektor doch ins Leere?
(Soweit ich das verstanden haben, wird das mittels Serialisierung des Objektes gelöst, deshalb brauchts auch einen Typen.)
Das wird bei mir über Context.GetType gemacht. In seinen Beispielen hat er nie ein Create gebraucht.

Du bist schon drei Schritte zu weit. Was hier fehlt ist ein:

Delphi-Quellcode:
Context := TRTTIContext.Create;

amoibos 29. Okt 2015 17:27

AW: Annotationen auslesen
 
Gut danke, ich werds morgen mal ausprobieren. Aber ich kann beschwören das alle Beispiele, und davon gibts im Buch viele, ohne Create auskommen. Da muss sich was geändert haben.

Uwe Raabe 29. Okt 2015 18:50

AW: Annotationen auslesen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von amoibos (Beitrag 1320145)
Gut danke, ich werds morgen mal ausprobieren. Aber ich kann beschwören das alle Beispiele, und davon gibts im Buch viele, ohne Create auskommen. Da muss sich was geändert haben.

Glaube ich kaum. Aus "Coding in Delphi" (PDF vom Juni 2014) am Ende von Kapitel 9.3:

alda 29. Okt 2015 19:33

AW: Annotationen auslesen
 
Ich würde Dir die RTTI Helper aus DSharp nahelegen, die erleichtern Dir den Umgang mit der RTTI und gerade Attributen/Annotations um ein vielfaches: Klick mich
Da musst Du dich auch nicht um den Context kümmern - das machen die Helper alle schon selbst.

Speziell zum Ermitteln der Attribute:
Delphi-Quellcode:
 TRttiObjectHelper = class helper for TRttiObject
  public
    ....
    function TryGetCustomAttribute<T: TCustomAttribute>(out AAttribute: T): Boolean;
  end;


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