Hallo zusammen,
ich spiele gerade etwas mit der neuen
RTTI rum und stoße da gerade auf ein kleines Problem.
Ich wollte die Propertys einer Klasse mit Attributen "dekorieren" und diese dann über entsprechende Methoden in eine Datenbank serialisieren. Soweit alles kein Problem, bis auf den Fakt, dass er beim Auslesen der Propertys z.Bsp. ein BOOLEAN Property als tkInteger abhandelt. Wenn ich jetzt versuche eine
Query mit Parametern zu bestücken um einen Datensatz zu speichern oder zu updaten sind diese Werte nicht zuweisungskompatibel.
Habe ich also eine Chance herauszubekommen von welchem realen Typ ein Property ist ?
Delphi-Quellcode:
procedure TKultur.WritePropValues (const AKultur: TKultur; AQuery : TnxQuery);
var
Context: TRttiContext;
RttiType: TRttiType;
PropInfo: TRttiProperty;
F: Boolean;
Attr: TCustomAttribute;
Value: TValue;
i : integer;
begin
if not Assigned(AKultur) then
Exit;
Context := TRttiContext.Create;
try
RttiType := Context.GetType(AKultur.ClassType);
if Assigned(RttiType) then
begin
for PropInfo in RttiType.GetProperties do
begin
F := False;
for Attr in PropInfo.GetAttributes do
begin
if Attr is DBField then
F := True;
end;
if F then
begin
Value := PropInfo.GetValue(AKultur);
case Value.Kind of
tkInt64,
tkInteger: AQuery.ParamByName (PropInfo.Name).asInteger := Value.AsInteger;
tkFloat: AQuery.ParamByName (PropInfo.Name).asFloat := Value.AsExtended;
tkChar,
tkWChar,
tkLString,
tkWString,
tkUString,
tkString: AQuery.ParamByName (PropInfo.Name).asString := Value.AsString;
end;
end;
end;
end;
finally
Context.Free;
end;