Delphi TRttiType.GetMethods返回零个trttitMethod实例

Delphi TRttiType.GetMethods返回零个trttitMethod实例,delphi,interface,rtti,Delphi,Interface,Rtti,我最近能够使用Robert Loves使用TRttiContext.FindType为接口获取TRttiType(“通过显式调用ctx.GetType注册”接口,例如RType:=ctx.GetType(TypeInfo(IMyPrettyLittleInterface));) 合乎逻辑的下一步是迭代所述接口的方法。考虑 program rtti_sb_1; {$APPTYPE CONSOLE} uses SysUtils, Rtti, mynamespace in 'mynamespace

我最近能够使用Robert Loves使用TRttiContext.FindType为接口获取TRttiType(“通过显式调用ctx.GetType注册”接口,例如RType:=ctx.GetType(TypeInfo(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.

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

我刚刚跟踪了正在发生的事情,在TRttiInterfaceType.Create,第5774行,它说:

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

在您的接口和它继承的IInterface中,HasRtti读作$FFFF。因此,显然没有为接口的方法生成RTTI,对于基本接口类型也是如此。我不知道为什么。除了巴里·凯利,我不知道谁会知道原因。

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

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

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

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

有时需要某些编译器指令来生成RTTI,比如M+。也许你只需要设置其中一个?毕竟戴夫是对的。事实证明,接口必须由{$M+}/{$M-}-子句包围。编译

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

是的。

戴夫毕竟是对的。事实证明,接口必须由{$M+}/{$M-}-子句包围。编译

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

确实如此。

哇,梅森;你很有勇气深入研究真实的来源。如果不是因为我的codeinsight,我想我自己也可以试一试。自从我从D2009更新后它就坏了…:|谢谢!我想我最好向QC报告。@调解人:勇敢?不。RTL实际上在很大程度上相当漂亮。大多数真正可怕的东西都在
系统中。pas
:P:)我把它报告为QC#85308;在我们谈话时试图绕开它。@调解人为什么报告被撤回了@Jeroenwiertplaimers真的不知道。我当然没有这么做。我周一回到办公室后会调查的;你很有勇气深入研究真实的来源。如果不是因为我的codeinsight,我想我自己也可以试一试。自从我从D2009更新后它就坏了…:|谢谢!我想我最好向QC报告。@调解人:勇敢?不。RTL实际上在很大程度上相当漂亮。大多数真正可怕的东西都在
系统中。pas
:P:)我把它报告为QC#85308;在我们谈话时试图绕开它。@调解人为什么报告被撤回了@Jeroenwiertplaimers真的不知道。我当然没有这么做。周一回到办公室后我会调查一下。显然,D2010不需要$M+(我想我忘了告诉你我正在使用)。D2010不需要$M+(我想我忘了告诉你我正在使用)。