我有一个有接口的类:
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
总是空的。当我尝试任何形式时都不是这样。有什么想法吗?
答案 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+}
。