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

时间:2010-11-06 14:23:24

标签: delphi class delphi-7 rtti

请帮助我。

我查找了存在的问题,但没有找到我如何在delphi类的动态数组中获取所有已发布的项目属性(声明为Class)(我使用的是Delphi 7 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;

我链接到了Eleers of TPersonList类(MyVariable:TPersonList)。

如何使用RTTI获取我的FSubClasses和FArray数组项的所有已发布属性的数据?

如何使用RTTI将新数据设置为FSubClasses?

谢谢你, 塞吉。

2 个答案:

答案 0 :(得分:1)

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

所以只需使用TypInfo单元。

  • GetPropList将为您提供所有属性的列表。
  • 然后为映射类的每个PPropInfo项调用GetObjectProp,并检索每个属性的实例。
  • 调用GetStrProp以检索字符串已发布属性的内容;
  • 调用GetOrdProp以检索整数已发布属性的内容。
  • 调用GetFloatProp获取浮点值,如TDateTime。

对于类发布的属性,在调用GetObjectProp之后,检查返回的实例类型,并根据其类(TObjectList或TListSubClass)枚举其内容。

这是我们在开源ORM中使用的一种方法(我们专门为属性访问提供了一些面向对象的类,因此我们不需要typinfo单元)。见http://synopse.info/fossil/finfo?name=SQLite3/SQLite3Commons.pas

答案 1 :(得分:0)

查看单位GetDynArrayProp的{​​{1}}和GetPropList

TypInfo返回指向底层数组的指针,然后可以将其转换为正确的数组类型。

GetDynArrayProp向您传入的类的所有属性返回指向属性信息数组的指针。

GetPropList返回的TPropInfo记录包含与属性关联的getter和setter方法的地址信息,您可以使用它们分别调用getter或setter。

一般情况下,您应该深入了解Delphi帮助中的GetPropList单元或在线文档:

http://docwiki.embarcadero.com/VCL/en/TypInfo