3

我正在 Delphi XE3 中使用 RTTI 做一些工作,到目前为止,这导致调用如下过程:

procedure MyProc( ARecordInstance : pointer; ARecordType : PTypeInfo );

我称这个例程如下:

MyProc( @MyRec TypeInfo( TMyRec ));

这一切都很好。

我突然想到,我也许可以将我的程序简化为:

procedure MyProc( var ARecord ); or procedure MyProc( ARecord : pointer );

..如果我可以在我的程序中从 ARecord 获取类型信息。但是,使用诸如“ARecord”之类的“实例”时,TypeInfo 会给出“期望类型标识符”错误,这是公平的。有什么方法可以将单个指针引用传递给我的记录,然后从中提取类型?

谢谢

4

2 回答 2

4

如果您需要支持多种类型,您可以将您的过程包装在具有通用参数的类中,然后该过程将知道它正在使用什么数据类型,例如:

type
  MyClass<T> = class
  public
    class procedure MyProc(var AInstance : T);
  end;

class procedure MyClass<T>.MyProc(var AInstance : T);
var
  InstanceType: PTypeInfo;
begin
  InstanceType := TypeInfo(T);
  //...
end;

.

MyClass<TMyRec>.MyProc(MyRec);
于 2012-10-15T21:14:43.393 回答
0

为什么不只是使用无类型的 var 参数编写代码:

procedure MyProc(var ARecordInstance; ARecordType : PTypeInfo);
begin
  ...

您将可以致电:

MyProc(MyRec,TypeInfo(TMyRec));

So avoid to type @MyRec. But you will also do not have strong type checking.

Using generics as proposed by Remy will allow strong typing, but will generate a bit more code.

于 2012-10-16T13:40:10.547 回答