如何通过Delphi在接口中定位特定方法的索引位置?

更新于
2026-10-04 18:18:17
1阅读来源:SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计492个文字,预计阅读时间需要2分钟。

如何找到Interface中定义的过程/函数引用?可以使用RTTI实现吗?首先,我们需要枚举接口的接口方法。

在这个程序中,我们使用{$APPTYPE CONSOLE},它依赖于System.SysUtils和System.Rtti。下面是如何实现查找Interface中定义的过程/函数引用的代码示例:

pascaluses System.SysUtils, System.Rtti;

type IMyIntf=interface procedure Foo; end;

var Obj: TObject;

procedure FindMethodReferences(AnInterface: IInterface);var Method: TRttiMethod; TypeInfo: PTypeInfo; MethodList: TStringList;begin MethodList :=TStringList.Create; try TypeInfo :=GetTypeInfo(AnInterface); if TypeInfo nil then begin Method :=TRttiMethod(GetMethodTypeInfo(TypeInfo, 'Foo')); if Method nil then MethodList.Add('Method: ' + Method.Name); end; finally if Assigned(MethodList) then MethodList.Free; end; if MethodList.Count > 0 then Writeln(MethodList.Text) else Writeln('No methods found.');end;

begin // 假设这里创建了一个实现了IMyIntf接口的对象 Obj :=TObject.Create; // ...

FindMethodReferences(IMyIntf(Obj));

Obj.Free;end.

如何找到Interface中定义的过程/函数索引?可以用RTTI完成吗? 首先,我们需要枚举接口的方法.不幸的是这个程序

{$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的存在.

标签:索引

本文共计492个文字,预计阅读时间需要2分钟。

如何找到Interface中定义的过程/函数引用?可以使用RTTI实现吗?首先,我们需要枚举接口的接口方法。

在这个程序中,我们使用{$APPTYPE CONSOLE},它依赖于System.SysUtils和System.Rtti。下面是如何实现查找Interface中定义的过程/函数引用的代码示例:

pascaluses System.SysUtils, System.Rtti;

type IMyIntf=interface procedure Foo; end;

var Obj: TObject;

procedure FindMethodReferences(AnInterface: IInterface);var Method: TRttiMethod; TypeInfo: PTypeInfo; MethodList: TStringList;begin MethodList :=TStringList.Create; try TypeInfo :=GetTypeInfo(AnInterface); if TypeInfo nil then begin Method :=TRttiMethod(GetMethodTypeInfo(TypeInfo, 'Foo')); if Method nil then MethodList.Add('Method: ' + Method.Name); end; finally if Assigned(MethodList) then MethodList.Free; end; if MethodList.Count > 0 then Writeln(MethodList.Text) else Writeln('No methods found.');end;

begin // 假设这里创建了一个实现了IMyIntf接口的对象 Obj :=TObject.Create; // ...

FindMethodReferences(IMyIntf(Obj));

Obj.Free;end.

如何找到Interface中定义的过程/函数索引?可以用RTTI完成吗? 首先,我们需要枚举接口的方法.不幸的是这个程序

{$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的存在.

标签:索引