Hallo,
ich versuche gerade ein wenig Erfahrung mit der
Rtti zu sammeln und versuche Attribute mit Generics zu verheiraten. In meinen Ansatz scheint aber irgendwie ein Fehler zu stecken:
Delphi-Quellcode:
unit uSettings;
interface
type
TSettingAttribute<T> =
class(TCustomAttribute)
private
m_default: T;
public
constructor Create(
const _default: T);
end;
TSettings =
class
private
procedure SetToDefault();
public
[TSettingAttribute<boolean>(false)]
m_AllowMultipleStarts: boolean;
constructor Create();
destructor Destroy();
override;
end;
implementation
uses
Rtti;
{ TSettings }
constructor TSettings.Create();
begin
SetToDefault();
end;
destructor TSettings.Destroy();
begin
inherited;
end;
procedure TSettings.SetToDefault();
var
ctx : TRttiContext;
t : TRttiType;
f : TRttiField;
a : TCustomAttribute;
v : TValue;
begin
ctx := TRttiContext.Create();
try
t := ctx.GetType(self);
for f
in t.GetFields()
do
begin
for a
in f.GetAttributes()
do
begin
if a
is TSettingAttribute<f.ClassType>
then // Hier Fehler
begin
v := f.GetValue(self);
v := TSettingAttribute<f.ClassType>(a).m_default;
// Und hier
f.SetValue(self, v);
end;
end;
end;
finally
ctx.Free();
end;
end;
{ TSettingAttribute<T> }
constructor TSettingAttribute<T>.Create(
const _default: T);
begin
m_default := _default;
end;
end.
In der Methode SetToDefault möchte ich alle Variablen, die mit dem generischen Attribute gekennzeichnet sind durchlaufen und mit dem Default Wert belegen. Der Compiler scheint sich allerdings an meinem Konstrukt TSettingAttribute<f.ClassType> zu stören. Wenn ich statt f.ClassType zum Beispiel integer schreibe kann ich es kompelieren.
Kann mir jemand erklären, woran genau sich der Compiler stört bzw. wie ich es richtig machen muss?
Viele Grüße und Danke
Najo