Delphi TRttiType.GetMethods返回零TRttiMethod实例

时间:2010-06-09 08:10:26

标签: delphi interface rtti

我最近能够使用TRttiContext.FindType使用Robert Loves "GetType"-workaround获取接口的TRttiType(通过显式调用ctx.GetType来“注册”接口,例如RType:= ctx.GetType (所属类别(IMyPrettyLittleInterface));)

一个合乎逻辑的下一步是迭代所述接口的方法。考虑

program rtti_sb_1;
{$APPTYPE CONSOLE}
uses
  SysUtils, Rtti, mynamespace in 'mynamespace.pas';
var
  ctx:      TRttiContext;
  RType:    TRttiType;
  Method:   TRttiMethod;
begin
  ctx := TRttiContext.Create;
  RType := ctx.GetType(TypeInfo(IMyPrettyLittleInterface));
  if RType <> nil then begin
    for Method in RType.GetMethods do
      WriteLn(Method.Name);
  end;
  ReadLn;
end.

这一次,我的mynamespace.pas看起来像这样:

IMyPrettyLittleInterface = interface
  ['{6F89487E-5BB7-42FC-A760-38DA2329E0C5}']
  procedure SomeProcedure;
end;

不幸的是,RType.GetMethods返回一个零长度的TArray实例。有没有人能够重现我的烦恼? (请注意,在我的示例中,我使用TRttiContext.GetType显式获取了TRttiType,而不是解决方法;包含的介绍是为了警告读者可能存在一些有关rtti和接口的未解决问题。)谢谢!

3 个答案:

答案 0 :(得分:2)

我只是追踪正在发生的事情,在TRttiInterfaceType.Create第5774行,它说:

hasRtti := ReadU16(P);
if hasRtti = $FFFF then
  Exit;

在您继承的接口和IInterface中,HasRtti读取为$ FFFF。因此,显然没有为接口的方法生成RTTI,对于基本接口类型甚至也是如此。我不知道为什么。除了Barry Kelly之外,不确定谁会知道原因。

答案 1 :(得分:1)

有时需要某些编译器指令来生成RTTI,比如M +。也许你只需要设置其中一个?

答案 2 :(得分:1)

毕竟Dave是对的。事实证明,接口必须被{$ M +} / {$ M - } - 子句包围。使用

进行编译
{$M+}
IMyPrettyLittleInterface = interface
  ['{6F89487E-5BB7-42FC-A760-38DA2329E0C5}']
  procedure SomeProcedure;
end;
{$M-}

做到了。