Delphi泛型记录的TypeInfo

3

我想要使用带有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

我不明白这两者之间有什么重大区别?虽然我不是一个低级专家,但编译器为什么要对此进行不同处理?我需要它适用于TMyInt和TMyString类型。

感谢任何帮助。


1
编译器是否报告错误? - David Heffernan
当然,对不起,我应该在我的帖子中包含这个:[DCC 错误] GenericTypeInfo.dpr(24):E2134 类型“TMyInt”没有类型信息。 - Rick Wheeler
2
在泛型方面,RTTI生成仍然没有完全完成。 - Remy Lebeau
"not 100% complete" 的意思是没有可行的解决方案吗? - Rick Wheeler
2个回答

7

这是 Delphi 2010 中的一个错误, 在XE及更高版本中已经得到修复。

但是有一个解决方法


据我所知,这种解决方法可以编译,但遗憾的是仍然没有类型信息可用(该方法返回nil)... - Arnaud Bouchez
解决方法是有效的,谢谢。但是我现在遇到了一个运行时类型转换问题,涉及到 RTTI。上述解决方法返回 TMyRec<String> 的 TypeInfo,但似乎无法使用 RTTI 和 TValue.Make 将其分配给 TMyString 属性。有什么想法吗?还是我应该发另一个问题。 - Rick Wheeler
@ArnaudBouchez 这篇文章说可能是这种情况,但实际上在这种特定情况下它返回一个有效的TypeInfo。我猜测该属性缺少typeinfo/RTTI,因为TypeInfo应该是兼容的(因为它与TMyString is TMyRec<string>完全相同)。 - Stefan Glienke
@RickWheeler 最好开一个新问题,然后发布你现在无法工作的代码。 - Stefan Glienke

3

这个例子在XE2中运行良好。(正如@StefanGlienke评论的那样,XE也可以)。

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

由于类型的解释是通过编译器魔法来完成的,因此解决方法是进行升级。


感谢提供的信息,这可能是升级的一个原因,但在花费金钱和大量时间升级其他库等之前,我更愿意探索其他解决方案。 - Rick Wheeler

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