Czy jest możliwe i jak utworzyć i dołączyć niestandardowy atrybut do pola w środowisku wykonawczym?Jak utworzyć i dołączyć atrybut niestandardowy do pola w środowisku wykonawczym w Delphi
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.
Running powyższy kod wyjściowy:
Bar Title
Chciałbym wstrzyknąć MyAttribute
o wartości Empty
do pól, które nie mają go w czasie wykonywania produkcji następujące dane wyjściowe:
Bar Title
Other Empty
Chociaż tak być może. To tylko dowodzi, że atrybuty nie są dużo lepiej dostosowane do serializacji niż opublikowana dyrektywa. –
@Dalija dlaczego opcje serializacji różnią się w czasie wykonywania –
Jednym z powodów jest zmiana serializacji klas poza Twoją kontrolą, jak w [serializacji JSON bez śmieci] (http://stackoverflow.com/questions/29276304/how-to-serialize -an-tlistt-to-json-without-garbage) –