Delphi Rtti:探索接口的属性?

时间:2010-09-12 13:46:06

标签: delphi interface rtti

有没有办法用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;

有没有人能够正确解决这个问题?

4 个答案:

答案 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);