Как мне создать универсальное TValue для пронумерованного поля RTTI?

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

5
задан Community 23 May 2017 в 12:06
поделиться