如何获取泛型类方法的地址?

3
我们可以使用以下代码获取类方法地址:
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.
1个回答

9

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.

这个程序输出了两个不同的值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接