vložil Radek Červinka
19. dubna 2011 00:00
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.
1TAttrID = class(TCustomAttribute)
2 private
3 FID: Integer;
4 public
5 constructor Create(iId:Integer);
6 property ID:Integer read FID write FID;
7 end;
8
9příklad:
10 [TAttrID(1)]
11 TMyClass = class
12 protected
13 [TAttrID(2)]
14 FName: string;
15 public
16 [TAttrID(3)]
17 procedure Print;
18 [TAttrID(4)]
19 property Name:string read FName write FName;
20 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.
1[TAttrID(293455)]
2 [TAttrID(22)]
3 TMyRecord = record
4 Name:string;
5 public procedure Print;
6 end;
7
8
9const
10 IDENT_REC = 2334;
11var
12 [TAttrID(IDENT_REC)]
13 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:
1uses
2 Rtti;
3….
4
5var
6 c : TRttiContext;
7 t : TRttiType;
8 a : TCustomAttribute;
9
10begin
11 c := TRttiContext.Create;
12 try
13 t := c.GetType(TMyClass);
14 for a in t.GetAttributes do
15 begin
16 Writeln((a as TAttrID).ID);
17 end;
18 finally
19 c.Free
20 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.