![]() |
Delphi-Version: 2010
D2010 RTTI besitzt ein object scope ?
hi @ all...
ich bin derzeit am rumschrauben mit delphi 2010 und den neuen RTTI "klassen" (in anfürungszeichen, da mir das mit pseudo record als object getarnt bekannt ist)... nun meine eigentlich frage: ich hab mir hier mal eine function gebaut die mir ein bestimmtes attribut auslesen soll:
Delphi-Quellcode:
in dieser schon etwas angepassten variante übergebe ich ein bereits bestehendes TRttiContext "object" mit. diese function gibt mir nun also ein TBasicAttribute bzw davon abgeleitetes attribut zurück. dieses object hat eine property, setze ich da nun ein value und rufe dann die function "getAttribute" wieder auf, hat das gleiche attribut vom gleichen object wieder den default wert ? gibt es denn keine möglichkeit attributen einen wert nachträglich zu setzen und dieses veränderten wert nachträglich wieder ab zu fragen ? es ist mir auch bewusst, dass hier die attribute auf die klasse bezieht und nicht auf das object selst, aber gibt es eine möglichkeit atribute an objecte zu binden ?
function getAttribute(ctx : TRttiContext; obj : TObject; attributeClass : TClass) : TBasicAttribute;
var // ctx: TRttiContext; t : TRttiType; p : TRttiProperty; a : TCustomAttribute; begin result := nil; // ctx := TRttiContext.Create; try t := ctx.GetType(obj.ClassType); for p in t.GetProperties do for a in p.GetAttributes do if a is attributeClass then begin result := a AS TBasicAttribute; exit; end; finally // ctx.Free; end; end; hoffe meine ausführung ist ansatzweise nachvollziehbar ? würde mich über eine antwort freuen... greez & thx, sky... |
AW: D2010 RTTI besitzt ein object scope ?
Attribute sind nur an eine Klasse gebunden, nicht an ein Objekt.
Und nein, soweit ich weiß, kannst du zur Lautzeit nicht an den Attributen herumschrauben. |
AW: D2010 RTTI besitzt ein object scope ?
Zitat:
greez & thx, sky... |
AW: D2010 RTTI besitzt ein object scope ?
Zitat:
Außerdem eine Warnung, was die Benutzung von TRttiContext mit Caching von Rtti-Objekten angeht. Benutz dafür eine globale Variable und gib ihn nicht als Parameter in Funktionen, ansonsten fliegt dir nämlich das Ding um die Ohren.
Delphi-Quellcode:
var
TypeCache: TList<TRttiType>; ctx: TRttiContext; function getAttribute(obj: TObject; attributeClass: TClass): TBasicAttribute; var t: TRttiType; p: TRttiProperty; a: TCustomAttribute; begin result := nil; try t := nil; for t in TypeCache do begin if t.ClassName = obj.ClassName then begin Break; end; end; if not Assigned(t) then begin t := ctx.GetType(obj.ClassType); TypeCache.Add(t); end; for p in t.GetProperties do for a in p.GetAttributes do if a is attributeClass then begin result := a as TBasicAttribute; exit; end; finally end; end; ... initialization if not Assigned(TypeCache) then begin TypeCache := TList<TRttiType>.Create; end; finalization if Assigned(TypeCache) then begin TypeCache.Free; end; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:54 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