Delphi RTTI:如何获取声明为类属性的动态数组的值
请帮帮我 我查找存在的问题,但没有找到如何在delphi类的动态数组中获取项(声明为类)的所有已发布属性(我使用Delphi7 IDE(我不能使用其他版本)) 我有以下代码:Delphi RTTI:如何获取声明为类属性的动态数组的值,delphi,class,delphi-7,rtti,Delphi,Class,Delphi 7,Rtti,请帮帮我 我查找存在的问题,但没有找到如何在delphi类的动态数组中获取项(声明为类)的所有已发布属性(我使用Delphi7 IDE(我不能使用其他版本)) 我有以下代码: TObjectList = array of TObject; TSubClass = class(TObject) private FFirstName: string; FLastName: string; FDOB: TDateTime; FArray : TObjectL
TObjectList = array of TObject;
TSubClass = class(TObject)
private
FFirstName: string;
FLastName: string;
FDOB: TDateTime;
FArray : TObjectList;
published
property FirstName: string read FFirstName write FFirstName;
property LastName: string read FLastName write FLastName;
property DOB: TDateTime read FDOB write FDOB;
property MyArray : TObjectList read FArray write FArray ;
end;
TListSubClass = array of TSubClass;
TPersonList = class(TObject)
private
FSubClasses: TListSubClass;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property SubClasses: TListSubClass read FSubClasses write FSubClasses;
end;
我有到TPersonList类(MyVariable:TPersonList)元素的链接
如何使用RTTI获取我的fsubclass和FArray数组项的所有已发布属性数据
如何使用RTTI将新数据设置到fsubclass
谢谢,,
Sergey.查看单元
TypInfo
的GetDynArrayProp
和GetPropList
GetDynArrayProp
返回指向底层数组的指针,然后可以将其转换为正确的数组类型
GetPropList
返回指向传入类的所有属性的属性信息数组的指针
从GetPropList
返回的TPropInfo
记录包含与属性关联的getter和setter方法的地址信息,您可以使用它们分别调用getter或setter
一般来说,您应该在Delphi帮助或在线文档中更深入地查看TypInfo
单元:
查看单元
TypInfo
的GetDynArrayProp
和GetPropList
GetDynArrayProp
返回指向底层数组的指针,然后可以将其转换为正确的数组类型
GetPropList
返回指向传入类的所有属性的属性信息数组的指针
从GetPropList
返回的TPropInfo
记录包含与属性关联的getter和setter方法的地址信息,您可以使用它们分别调用getter或setter
一般来说,您应该在Delphi帮助或在线文档中更深入地查看TypInfo
单元:
您所谓的“动态数组”并不是Delphi世界中所谓的“动态数组”。
“动态数组”定义为MyVar:例如整数数组。在您的类中,您只有TList后代。这些TList子体是某种动态存储,但它被称为TList(或TObjectList),而不是“动态数组”
所以只需使用TypInfo单元
- GetPropList将为您提供所有属性的列表
- 然后为映射类的每个PPropInfo项调用GetObjectProp,并检索每个属性的实例
- 调用GetStrProp检索字符串发布属性的内容李>
- 调用GetOrdProp检索整数发布属性的内容
- 调用GetFloatProp获取浮点值,如TDateTime
- GetPropList将为您提供所有属性的列表
- 然后为映射类的每个PPropInfo项调用GetObjectProp,并检索每个属性的实例
- 调用GetStrProp检索字符串发布属性的内容李>
- 调用GetOrdProp检索整数发布属性的内容
- 调用GetFloatProp获取浮点值,如TDateTime
这就是我们在开源ORM中使用的方法(我们已经为属性访问指定了一些面向对象的类,所以我们不需要typinfo单元)。请参见谢谢您的回答,但当我通过这种方式获取数组项时,为什么项没有classinfo信息?此属性为零。你说的“没有classinfo信息”是什么意思?你能用你到目前为止尝试过的代码编辑你的问题吗?我是说当我从GetDynArrayProp获取数组时,项目不包括classinfo信息。在我的研究之后,我找到了我需要获取物品属性的部分的解决方案。如果类的父类是TPersistent,那么GetDynArrayProp-可以工作。PS对不起我的英语-我是学生^ ^“如果你想使用RTTI(即发布的属性类型信息),父类必须在上用RTTI声明(Delphi 2010之前)。这是TPersistent的情况,但不是ToObject类型。你可以使用{$M+}强制执行此操作类的类型声明之前的条件,以及{$M-}在这之后。@Serg博士:如果你能像a.Bouchez建议的那样使用TList或TObjectList或它们的后代,那就容易多了。使用指针更容易出错。如果你编辑了你的问题以包含你当前的代码状态,这也会很有用。谢谢你的回答,但当我通过这种方式获得数组项时,为什么这些项会出现错误呢不是classinfo信息吗?此属性为零。“没有classinfo信息”是什么意思“,您能用您迄今为止尝试过的代码编辑您的问题吗?我的意思是,当我从GetDynArrayProp获取数组时,项目不包括classInfo信息。在我的研究之后,我找到了我需要获取物品属性的部分的解决方案。盖特纳拉