Einzelnen Beitrag anzeigen

Najo

Registriert seit: 23. Mai 2009
9 Beiträge
 
#1

[Rtti] Generische Attribute

  Alt 26. Mär 2010, 23:01
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
  Mit Zitat antworten Zitat