Nella domanda here viene mostrato un metodo per creare un TValue compatibile da utilizzare con SetValue. Sto cercando di creare una versione generica di questo, per utilizzare RTTI per memorizzare una classe in un file INI. Questo è il mio codice abbattuto:Come si crea un TValue generico per il campo RTTI enumerato?
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;
Nella risposta si fa riferimento, la soluzione era quella di ottenere il valore utilizzando il metodo TValue.From(), ma che sembra richiedere una variabile del tipo appropriato. Non ho un tipo come il mio codice non sa cosa sia.
Sto cercando un esempio di modo generico per ottenere un valore in una stringa da RTTI e reinserirlo in seguito. Non ho ancora trovato un buon tutorial su questo argomento.
Ok, questo ha funzionato bene una volta che avevo smesso di essere intelligente nel mio codice di salvataggio. Per ottenere il valore da salvare su INI, usa xField.GetValue (xObject) .ToString; – mj2008