1

私は最近、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 とインターフェイスに関して未解決の問題がある可能性があることを読者に警告するために含まれています。) ありがとう!

4

3 に答える 3

2

何が起こっているのかをたどったところ、TRttiInterfaceType.Create の 5774 行目に次のように書かれています。

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

また、インターフェースとそれが継承する IInterface の両方で、HasRtti は $FFFF として読み取ります。したがって、インターフェイスのメソッドに対して RTTI が生成されていないように見えます。これは、基本インターフェイス タイプにも当てはまります。どうしてか分かりません。バリー・ケリーを除いて、誰がその理由を知っているかわかりません.

于 2010-06-09T12:43:46.003 に答える
1

M +のように、RTTIを生成するために時々必要となる特定のコンパイラ指令があります。おそらく、それらの1つを設定する必要がありますか?

于 2010-06-09T15:18:02.753 に答える
1

結局、デイブは正しかった。結局のところ、インターフェースは {$M+}/{$M-} 句で囲む必要があります。でコンパイル

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

それをします。

于 2010-06-10T08:25:57.803 に答える