![]() |
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:
Als Instance wird das Objekt übergeben und die unterschiedlichen Klassen werden von TBaseState abgeleitet, welche zus. noch ein Attribut ModuleState besitzen.
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; [...] 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. |
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...
|
AW: Annotationen auslesen
Zitat:
|
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. |
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...
|
AW: Annotationen auslesen
Zitat:
Delphi-Quellcode:
Context := TRTTIContext.Create;
|
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.
|
AW: Annotationen auslesen
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
|
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:
![]() 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 03:14 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 by Thomas Breitkreuz