En la pregunta here, se muestra un método para crear un TValue compatible para usar con SetValue. Estoy tratando de hacer una versión genérica de esto, para usar RTTI para almacenar una clase en un archivo INI. Este es mi reducir código:¿Cómo creo un TValue genérico para el campo RTTI enumerado?
procedure TMyClass.LoadRTTI(xObject: TObject);
var
LContext: TRttiContext;
LClass: TRttiInstanceType;
xField : TRttiField;
szNewValue : String;
xValue : TValue;
begin
LContext := TRttiContext.Create;
LClass := LContext.GetType(xObject.ClassType) as TRttiInstanceType;
for xField in LClass.GetDeclaredFields do
begin
szNewValue := IniFile.ReadString(szSection, xField.Name, '');
if szNewValue <> '' then // emumerated will be '0' (zero) as that is what GetValue.AsString returns
begin
case xField.FieldType.TypeKind of
tkEnumeration: xValue := StrToIntDef(szNewValue, xField.GetValue(xObject).AsOrdinal);
end;
xField.SetValue(xObject, xValue); // FAILS HERE with 'Invalid calss typecast
end;
end;
end;
En la respuesta se hace referencia, la solución era conseguir el valor utilizando el método TValue.From(), pero que parece requerir una variable del tipo apropiado. No tengo ese tipo porque mi código no sabe de qué se trata.
Estoy buscando un ejemplo de una forma genérica para obtener un valor en una cadena del RTTI, y volver a colocarlo después. No he encontrado un buen tutorial que cubra esto todavía.
De acuerdo, funcionó bien una vez que dejé de ser inteligente en mi código de guardado. Para obtener el valor para guardar en el INI, simplemente use xField.GetValue (xObject) .ToString; – mj2008