В вопросе здесь показан способ создания совместимого значения TValue для использования с SetValue.Я пытаюсь сделать общую версию этого, чтобы использовать RTTI для сохранения класса в INI-файл.Это мой сокращенный код:
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;
В указанном ответе решение состояло в том, чтобы получить значение с помощью метода TValue.From (), но для этого требуется переменная соответствующего типа.У меня нет такого типа, поскольку мой код не знает, что это такое.
Я ищу пример общего способа получить значение в строке из RTTI и затем вернуть его обратно.Я еще не нашел хорошего учебника, который бы охватывал это.