加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

如何使用Delphi RTTI来获取和设置记录值

发布时间:2020-12-15 04:28:13 所属栏目:大数据 来源:网络整理
导读:我试图在Delphi XE或更高版本中使用增强的RTTI功能来读取和写入对象到 XML.到目前为止,我已经成功地使用整数,浮点数,字符串,枚举类型,集合和类,但无法正确输出或读取记录.问题似乎是获取一个实例(指针)到record属性. //Outputs Properties To XMLprocedure T
我试图在Delphi XE或更高版本中使用增强的RTTI功能来读取和写入对象到 XML.到目前为止,我已经成功地使用整数,浮点数,字符串,枚举类型,集合和类,但无法正确输出或读取记录.问题似乎是获取一个实例(指针)到record属性.
//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;

我怀疑如果我能弄清楚如何获得价值,那么设置它们不应该是一个问题.然后到数组,哦,男孩!

更新:请参阅below.(迁移为单独的答案以提高可见性).

解决方法

我假定您正在尝试保存自己的运行时类型的记录类型字段的值,是吗?

您必须首先使用FProp.GetValue(Self)获取该字段的值.假设你把它放在一个名为FieldValue的变量,类型为TValue.然后,您可以随意保存记录值的字段,尽管您可能希望为其编写递归过程,因为记录的字段本身可能是字段.用于记录的场吸气剂期望记录的地址(指向其开始的指针)与设定者对称;设定者期望地址而不是值,因为否则将不会有简单的方法来修改另一个类或记录中的“原位”字段,因为记录以其他方式传递给值.

您可以通过FieldValue.GetReferenceToRawData获得该值,该值将返回指向TValue中存储的记录开头的指针.

希望这能给你足够的线索来继续.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读