Как использовать Delphi RTTI для получения и установки значений записи

Я пытаюсь использовать расширенные функции RTTI в Delphi XE или более поздних версиях для чтения и записи объектов в XML. До сих пор мне удавалось работать с целыми числами, числами с плавающей запятой, строками, перечисляемыми типами, наборами и классами, но я не мог правильно выводить или читать записи. Кажется, проблема заключается в получении экземпляра (указателя) на свойство записи.

//Outputs Properties To XML
procedure TMyBase.SaveToXML(node: TJclSimpleXMLElem);
var
  child , subchild : TjclSimpleXMLElem ;
  FContext : TRttiContext ;
  FType    : TRttiType ;
  FProp    : TRttiProperty ;
  Value    : TValue ;
  MyObj    : TMyBase ;
  FField   : TRttiField ;
  FRecord  : TRttiRecordType ;
  Data     : TValue ;
begin
  FContext := TRttiContext.Create ;
  FType := FContext.GetType ( self.ClassType ) ;
  Child := node.Items.Add ( ClassName ) ;
  for FProp in FType.GetProperties do begin
    if FProp.IsWritable then begin
      case FProp.PropertyType.TypeKind of
        tkClass : begin
          MyObj := TMyBase ( FProp.GetValue ( self ).AsObject ) ;
          MyObj.SaveClass ( Child.Items.Add ( FProp.Name ) , FContext ) ;
          end ;
        tkRecord : begin
          subchild := Child.Items.Add ( FProp.Name ) ;
          FRecord := FContext.GetType(FProp.GetValue(self).TypeInfo).AsRecord ;
          for FField in FRecord.GetFields do begin
            >>> self is not the correct instance <<<
            Value := FField.GetValue ( self ) ;
            subchild.Items.Add ( FField.Name ).Value := Value.ToString ;
            end;
          end ;
        else begin
          Value := FProp.GetValue(self) ;
          Child.Items.Add ( FProp.Name ).Value := Value.ToString ;
          end;
        end;
      end ;
    end ;
  FContext.Free ;
end;

Я подозреваю, что если я смогу выяснить, как получить значения, то их установка не должна стать проблемой. Затем на массивы, о мальчик!

Обновления: См. ниже . (Перенесен как отдельный ответ для улучшения видимости).

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