【问题标题】:Delphi TypeInfo for generic records通用记录的 Delphi TypeInfo
【发布时间】:2013-08-11 01:59:29
【问题描述】:

我正在尝试将通用记录与 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 类型。

感谢您的帮助。

【问题讨论】:

  • 编译器是否报错
  • 是的,当然很抱歉,我应该在我的帖子中包含这个:[DCC 错误] GenericTypeInfo.dpr(24): E2134 Type 'TMyInt' has no type info
  • 在泛型方面,RTTI 生成还没有 100% 完成。
  • “未 100% 完成”是否意味着没有可用的解决方法?

标签: delphi generics delphi-2010 rtti typeinfo


【解决方案1】:

这是一个bug in Delphi 2010,已针对 XE 及更高版本进行了修复。

但是有一个workaround

【讨论】:

  • +1 据我了解,该解决方法允许编译,但遗憾的是仍然没有可用的类型信息(该方法返回 nil)...
  • 解决方法是有效的,谢谢,但我现在遇到了 RTTI 的运行时类型转换问题。上述解决方法返回 TMyRec 的 TypeInfo,似乎无法使用 RTTI 和 TValue.Make 将其分配给 TMyString 属性。有任何想法吗?或者我应该发布另一个问题。
  • @ArnaudBouchez 文章说可能是这种情况,但实际上在这种特殊情况下它返回了一个有效的 TypeInfo。我猜该属性缺少 typeinfo/RTTI,因为 TypeInfo 应该兼容(因为它与 TMyString is TMyRec 完全相同)
  • @RickWheeler 最好打开一个新问题并发布您现在不起作用的代码。
【解决方案2】:

此示例在 XE2 中运行良好。 (和 XE 作为@StefanGlienke cmets)。

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

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

【讨论】:

  • 感谢您提供信息,可能是升级的一个案例,但在花钱和花大量时间升级其他库等之前,更愿意探索其他解决方案。
猜你喜欢
  • 1970-01-01
  • 2011-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多