如何在界面中找到方法的索引?

时间:2015-01-15 17:19:46

标签: delphi delphi-xe7

如何找到Interface中定义的过程/函数索引?可以用RTTI完成吗?

1 个答案:

答案 0 :(得分:3)

首先,我们需要枚举接口的方法。不幸的是这个程序

{$APPTYPE CONSOLE}

uses
  System.SysUtils, System.Rtti;

type
  IMyIntf = interface
    procedure Foo;
  end;

procedure EnumerateMethods(IntfType: TRttiInterfaceType);
var
  Method: TRttiMethod;
begin
  for Method in IntfType.GetDeclaredMethodsdo
    Writeln('Name: ' + Method.Name + 'Index: ' + IntToStr(Method.VirtualIndex));
end;

var
  ctx: TRttiContext;

begin
  EnumerateMethods(ctx.GetType(TypeInfo(IMyIntf)) as TRttiInterfaceType);
end.

不产生输出。

此问题涉及此问题:Delphi TRttiType.GetMethods return zero TRttiMethod instances

如果您读到该问题的底部,则答案表明使用{$M+}进行编译将导致发出足够的RTTI。

{$APPTYPE CONSOLE}

{$M+}

uses
  System.SysUtils, System.Rtti;

type
  IMyIntf = interface
    procedure Foo(x: Integer);
    procedure Bar(x: Integer);
  end;

procedure EnumerateMethods(IntfType: TRttiInterfaceType);
var
  Method: TRttiMethod;
begin
  for Method in IntfType.GetDeclaredMethods do
    Writeln('Name: ' + Method.Name + 'Index: ' + IntToStr(Method.VirtualIndex));
end;

var
  ctx: TRttiContext;

begin
  EnumerateMethods(ctx.GetType(TypeInfo(IMyIntf)) as TRttiInterfaceType);
end.

输出结果为:

Name: FooIndex: 3
Name: BarIndex: 4

请记住,所有接口都来自IInterface。所以人们可能会期待它的成员出现。但是,IInterface似乎是在{$M-}状态下编译的。似乎这些方法按顺序列举,尽管我没有理由相信这是有保证的。

感谢@RRUZ指出VirtualIndex的存在。