Delphi RTTI:如何获取声明为类属性的动态数组的值

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

请帮帮我

我查找存在的问题,但没有找到如何在delphi类的动态数组中获取项(声明为类)的所有已发布属性(我使用Delphi7 IDE(我不能使用其他版本))

我有以下代码:

  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
对于已发布的类属性,在调用GetObjectProp后,检查返回的实例类型,并根据其类(TObjectList或TListSubClass)枚举其内容

这就是我们在开源ORM中使用的方法(我们已经为属性访问指定了一些面向对象的类,所以我们不需要typinfo单元)。请参见

您所谓的“动态数组”并不是Delphi世界中所谓的“动态数组”。 “动态数组”定义为MyVar:例如整数数组。在您的类中,您只有TList后代。这些TList子体是某种动态存储,但它被称为TList(或TObjectList),而不是“动态数组”

所以只需使用TypInfo单元

  • GetPropList将为您提供所有属性的列表
  • 然后为映射类的每个PPropInfo项调用GetObjectProp,并检索每个属性的实例
  • 调用GetStrProp检索字符串发布属性的内容
  • 调用GetOrdProp检索整数发布属性的内容
  • 调用GetFloatProp获取浮点值,如TDateTime
对于已发布的类属性,在调用GetObjectProp后,检查返回的实例类型,并根据其类(TObjectList或TListSubClass)枚举其内容


这就是我们在开源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信息。在我的研究之后,我找到了我需要获取物品属性的部分的解决方案。盖特纳拉