如何获得通用类方法的方法地址



我们可以通过此代码获得类方法地址:

type
  TMyClass = class
    procedure A;
  end;
var P: Pointer;
begin
  P := @TMyClass.A;
end;

对于通用类,如何从通用类获取方法地址?

type
  TGeneric<T> = class
    procedure A;
  end;

var P: Pointer;
begin
  P := @TGeneric<T>.A;  // <--- compilation error
end.

TGeneric<T>是开放类型,换句话说,并非所有类型的参数都已指定。您的代码失败了,因为开放类型的方法没有一个地址。不同的具体实例有不同的地址。例如,TGeneric<Integer>.ATGeneric<string>.A不同,因此具有不同的地址。

除非您为通用类型参数提供具体值,否则该构造没有意义。考虑此程序:

{$APPTYPE CONSOLE}
type
  TGeneric<T> = class
    class procedure A;
  end;
class procedure TGeneric<T>.A;
var
  P: Pointer;
begin
  P := @TGeneric<T>.A;
  Writeln(NativeInt(P));
end;
begin
  TGeneric<Integer>.A;
  TGeneric<string>.A;
end.

此程序输出两个不同的值。

最新更新