В вопросе здесь показан метод создания совместимого 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, а затем вернуть его обратно. Я еще не нашел хорошего руководства, которое бы это освещало.