私は最近、TRttiContext.FindType を使用してインターフェイスの TRttiType を取得できるようになりました。Robert Loves の「GetType」回避策(ctx.GetType への明示的な呼び出しによるインターフェイスの「登録」、たとえば RType := ctx.GetType(TypeInfo( IMyPrettyLittleInterface));)。
論理的な次のステップの 1 つは、上記のインターフェイスのメソッドを反復することです。検討
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 とインターフェイスに関して未解決の問題がある可能性があることを読者に警告するために含まれています。) ありがとう!