Is it possible and how to create and attach a custom attribute to a field at runtime?
uses System.SysUtils, System.Classes, System.Rtti; type MyAttribute = class(TCustomAttribute) private fCaption: string; public constructor Create(const aCaption: string); property Caption: string read fCaption write fCaption; end; TFoo = class(TPersistent) public [MyAttribute('Title')] Bar: string; Other: string; end; constructor MyAttribute.Create(const aCaption: string); begin fCaption := aCaption; end; procedure CreateAttributes(Typ: TRttiType); var Field: TRttiField; MyAttr: MyAttribute; begin for Field in Typ.GetFields do begin if Length(Field.GetAttributes) = 0 then begin MyAttr := MyAttribute.Create('Empty'); // how to attach created attribute to Field ??? end; end; end; var Context: TRttiContext; Typ: TRttiType; Field: TRttiField; Attr: TCustomAttribute; begin Context := TRttiContext.Create; Typ := Context.GetType(TFoo); CreateAttributes(Typ); for Field in Typ.GetFields do for Attr in Field.GetAttributes do if Attr is MyAttribute then writeln(Field.Name + ' ' + MyAttribute(Attr).Caption); readln; Context.Free; end.
Code execution above:
Bar Title
I would like to add MyAttribute to the Empty value in fields that do not have it at runtime, producing the following output:
Bar Title Other Empty
source share