如何在接口中找到方法的索引?
How to find index of a method in an interface?
如何找到在接口中定义的 procedure/function 的索引?可以用 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
的存在。
如何找到在接口中定义的 procedure/function 的索引?可以用 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
的存在。