V Delphi 2010 přibyla možnost používat atributy v kódu. Jedná se o podobný mechanismus jako je i v .NET a tento mechanismus otevírá celkem velké možnosti.
Tento mechanismus umožňuje označit část kódu (např. třída, proměnná, metoda…) určitým způsobem a za běhu s ním pracovat. Základem pro toto označování je třída TCustomAttribute.
Pokud tedy potřebujeme něco specifikovat, tak vytvoříme následníka této třídy a v kódu ho následně použijeme.
TAttrID = class(TCustomAttribute)
private
FID: Integer;
public
constructor Create(iId:Integer);
property ID:Integer read FID write FID;
end;
příklad:
[TAttrID(1)]
TMyClass = class
protected
[TAttrID(2)]
FName: string;
public
[TAttrID(3)]
procedure Print;
[TAttrID(4)]
property Name:string read FName write FName;
end;
V ukázce byl deklarován typ atributu TAttrID, který má jeden parametr (viz. constructor). Následně je na několika místech použit.
[TAttrID(293455)]
[TAttrID(22)] // double attr
TMyRecord = record
Name:string;
public procedure Print;
end;
const
IDENT_REC = 2334;
var
[TAttrID(IDENT_REC)]
rec:TMyRecord;
Lze specifikovat i více atributů a označit lze prakticky všechno.
Za běhu lze přistupovat přes RTTI např. takto:
uses
Rtti;
….
var
c : TRttiContext;
t : TRttiType;
a : TCustomAttribute;
begin
c := TRttiContext.Create;
try
t := c.GetType(TMyClass);
for a in t.GetAttributes do
begin
Writeln((a as TAttrID).ID);
end;
finally
c.Free
end;
Na co to použít? Většina lidí to používá na některou formu persistence - tj. uložení objektu někam a pak ho znovu načíst. Např. se dá specifikovat u jednotlivých polí objektu sloupce DB. Myslím, že se to používá i v DataSnap a jinde.
Různé možnosti použití viz. tindex.net/Attributes.html, např. XML serializace.
Původně jsem o tom ani nechtěl psát, jelikož to reálně nepoužívám, ale chtěl jsem aby byl popis novinek v Delphi (aspoň v hlavních věcech skoro) kompletní. Třeba to někoho inspiruje.