我最近能够使用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和接口的未解决问题。)谢谢!
答案 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)
{$M+}
IMyPrettyLittleInterface = interface
['{6F89487E-5BB7-42FC-A760-38DA2329E0C5}']
procedure SomeProcedure;
end;
{$M-}
做到了。