我正在使用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会给出'期望类型标识符'错误,这是公平的。有什么方法可以将单个指针引用传递给我的记录,然后从中提取类型吗?
由于
答案 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提出的泛型将允许强类型,但会生成更多代码。