我最近能够使用 Robert Loves “GetType”-workaround(通过显式调用 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.
这一次,我的mynamespace.pas
样子是这样的:
IMyPrettyLittleInterface = interface
['{6F89487E-5BB7-42FC-A760-38DA2329E0C5}']
procedure SomeProcedure;
end;
不幸的是,RType.GetMethods
返回一个长度为零的 TArray 实例。有没有人能重现我的烦恼?(请注意,在我的示例中,我已使用 TRttiContext.GetType 显式获取 TRttiType,而不是解决方法;包含介绍是为了警告读者可能存在一些关于 rtti 和接口的未解决问题。)谢谢!