Delphi Rtti:探讨接口的属性?

9
有没有一种方法可以使用 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个回答

5

接口是函数的集合。它们并没有像对象一样具有属性;这只是编译器为了让你更容易地编写代码而添加的一点语法糖。区别在于,对于对象,属性允许受控访问私有和受保护成员,而对于接口,所有成员都是公共的,因此不需要属性。


好的,但是探索接口方法也不起作用...只是用RttiType.GetMethods替换了for循环,仍然没有结果。 - Christian Metzler
4
@Christian:我刚刚查看了RTTI系统的代码,发现标准库中许多接口都没有生成RTTI。我不确定为接口类型生成扩展RTTI的规则是什么,因为这似乎与为类或记录生成扩展RTTI的规则不同。也许Barry Kelly或Allen Bauer可以回答这个问题? - Mason Wheeler
接口类型需要应用 {M+} 才能使 TRttiType.GetMethods() 报告接口的方法。 - Remy Lebeau

1
据我所知,普通接口不受支持。您可以添加{$M+},然后重试。

1
请在您的界面中添加此功能。
function GetObject: TObject;

并在类中实现它。 使用带有 RTTI 例程的 GetObject 函数

var
  obj: IPerson;
begin
  obj := TPerson.Create;
  Count := GetPropList(obj.GetObject.ClassInfo, tkAny, @List);
end;

请注意,您的类应该继承自TInterfacedPersistent而不是TInterfacedObject。
TPerson = class(TInterfacedPersistent, IPerson)

-1

回答晚了,但你可以将你的接口强制转换为TObject类型,例如:

RttiType := Ctx.GetType(TObject(IMyInterface).ClassInfo);

这是不正确且危险的。由于内存布局,接口无法转换回对象。您必须向接口添加一个函数才能返回对象(就像@FLICKER的答案中所示)。 - Jens Mühlenhoff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接