列出实现接口的类的所有属性

时间:2015-04-08 20:52:03

标签: delphi delphi-xe2

我有一个有接口的类:

TInterface = interface(IXMLNode)
  function Get_One: Boolean;
  function Get_Two: Boolean;
  function Get_Three: Boolean;
  procedure Set_One(Value: Boolean);
  procedure Set_Two(Value: Boolean);
  procedure Set_Three(Value: Boolean);
  property One: Boolean read Get_One write Set_One;
  property Two: Boolean read Get_Two write Set_Two;
  property Three: Boolean read Get_Three write Set_Three;
end;

TTesting = class(TXMLNode, TInterface)
protected
  function Get_One: Boolean;
  function Get_Two: Boolean;
  function Get_Three: Boolean;
  procedure Set_One(Value: Boolean);
  procedure Set_Two(Value: Boolean);
  procedure Set_Three(Value: Boolean);
end;

并希望列出所有属性。我试过这个:

GetMem(PropList, SizeOf(PropList^));

PropCount := GetPropList(TTesting.ClassInfo, tkAny, nil);   
GetMem(PropList, PropCount*SizeOf(PPropInfo));
GetPropList(TTesting.ClassInfo, tkAny, PropList);

PropList总是空的。当我尝试任何形式时都不是这样。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

GetPropList()基于旧式RTTI,它只描述声明为published的类属性和类方法(没有任何项目),并且只有类或祖先(与TPeristent)类似,已被标记为{$M+}

由于您使用的是XE2,因此您可以使用Extended RTTI(在Delphi 2010中引入)。它没有这样的限制。例如:

uses
  System.Rtti;

var
  Ctx: TRttiContext;
  PropList: TArray<TRttiProperty>;
begin
  PropList := Ctx.GetType(TTesting).GetProperties;
  ...
end;

更新:接口是一种特殊情况。一个接口只允许包含抽象方法,属性只是调用那些方法的语法糖。因此,在接口上定义的属性不是真正的属性,就像它们在类类型上一样,因此不会生成RTTI。这就是为什么你不能枚举从接口继承的属性。您可以使用扩展RTTI枚举接口的方法,但前提是接口已标记为{$M+}