用于通用记录的Delphi TypeInfo

时间:2013-08-09 06:58:20

标签: delphi generics delphi-2010 rtti typeinfo

我正在尝试使用RTTI的通用记录,但遇到了类型信息的问题。有谁知道为什么以下不能使用Delphi 2010进行编译?

program GenericTypeInfo;

{$APPTYPE CONSOLE}

uses
  TypInfo,
  SysUtils;

type

  TMyRec<T> = record
  public
    Value: T;
  end;

  TMyInt = TMyRec<Integer>;
  TMyString = TMyRec<String>;

begin

  try
    Writeln(GetTypeName(TypeInfo(TMyRec<Integer>)));     <--- This works fine
    Writeln(GetTypeName(TypeInfo(TMyRec<String>)));      <---   so does this
    Writeln(GetTypeName(TypeInfo(TMyInt)));              <--- BUT this won't compile
    Writeln(GetTypeName(TypeInfo(TMyString)));           <---   nor this!!
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;

  Readln;

end.

上面指出的行会产生以下编译器错误:

[DCC Error] GenericTypeInfo.dpr(24): E2134 Type 'TMyInt' has no type info
[DCC Error] GenericTypeInfo.dpr(24): E2134 Type 'TMyString' has no type info

我不能说2之间的最大区别是什么?我承认我不是一个低级别的专家,但为什么编译器会以不同的方式对待它?我需要它来处理TMyInt和TMyString类型。

感谢您的帮助。

2 个答案:

答案 0 :(得分:7)

这是bug in Delphi 2010,已为XE及更高版本修复过。

但是有workaround

答案 1 :(得分:3)

此示例在XE2中正常工作。 (和XE一样@StefanGlienke评论)。

Delphi-2010中的RTTI和泛型在很多方面都缺乏实现。

由于类型的解释是由编译器魔术完成的,因此解决方法是升级。