gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 14:40:00 26 4
gpt4 key购买 nike

我正在尝试使用 Delphi XE 或更高版本中的增强 RTTI 功能来读取和写入 XML 对象。到目前为止,我已经成功地处理了整数、 float 、字符串、枚举类型、集合和类,但无法正确输出或读取记录。问题似乎是获取指向记录属性的实例(指针)。

//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 。 (作为单独的答案迁移以提高可见性)。

最佳答案

我认为您正在尝试保存运行时类型 Self 的记录类型字段的值,是吗?

您必须首先使用FProp.GetValue(Self)获取字段的值。假设您将其放入 TValue 类型的名为 FieldValue 的变量中。然后,您可以根据需要保存记录值的字段,尽管您可能希望为其编写一个递归过程,因为记录的字段本身可能就是字段。记录的字段 getter 需要记录的地址(指向其开头的指针),以便与 setter 对称; setter 需要的是地址而不是值,否则就没有简单的方法来修改另一个类或记录中的“原位”字段,因为记录是按值传递的。

您可以通过 FieldValue.GetReferenceToRawData 获得该结果,它将返回一个指向存储在 TValue 内的记录开头的指针。

希望这能为您提供足够的线索来继续。

关于delphi - 如何使用Delphi RTTI获取和设置记录值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4718399/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com