有没有办法用Rtti探索界面的属性?
以下代码不起作用:
procedure ExploreProps;
var
Ctx: TRttiContext;
RttiType: TRttiType;
RttiProp: TRttiProp;
begin
RttiType := Ctx.GetType(TypeInfo(IMyInterface));
for RttiProp in RttiType.GetProperties do
Writeln(RttiProp.ToString);
end;
有没有人能够正确解决这个问题?
答案 0 :(得分:5)
接口是函数的集合。它们并不像对象那样具有属性;这只是编译器为您添加的一些语法糖,以便更容易为它们编写代码。区别在于对象,属性允许对私有和受保护成员的受控访问,而在接口上,所有成员都是公共的,因此不需要属性。
答案 1 :(得分:1)
据我所知,不支持普通接口。您可以添加{$ M +},然后重试。
答案 2 :(得分:1)
在界面中添加此功能
function GetObject: TObject;
并在课堂上实现它。 将GetObject函数与RTTI例程一起使用
var
obj: IPerson;
begin
obj := TPerson.Create;
Count := GetPropList(obj.GetObject.ClassInfo, tkAny, @List);
end;
请注意,您的类应继承自TInterfacedPersistent而不是TInterfacedObject
TPerson = class(TInterfacedPersistent, IPerson)
答案 3 :(得分:-1)
迟到的答案,但您可以将您的接口强制转换为Object,例如
RttiType := Ctx.GetType(TObject(IMyInterface).ClassInfo);