我可以在delphi中简化RTTI的使用吗?

时间:2012-10-15 08:57:02

标签: delphi delphi-xe2 rtti

我正在使用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会给出'期望类型标识符'错误,这是公平的。有什么方法可以将单个指针引用传递给我的记录,然后从中提取类型吗?

由于

2 个答案:

答案 0 :(得分:4)

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

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);

答案 1 :(得分:0)

为什么不使用un-typed var参数进行编码:

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

您可以致电:

MyProc(MyRec,TypeInfo(TMyRec));

因此,请避免输入@MyRec。但是你也没有强大的类型检查。

使用Remy提出的泛型将允许强类型,但会生成更多代码。