【问题标题】:no RTTI on unamed data types未命名数据类型上没有 RTTI
【发布时间】:2010-01-26 08:44:51
【问题描述】:

AFAIK 如果类型未命名,编译器不会生成 RTTI。 例如:T = 整数的数组[0..1,0..1]; 在这种情况下,可以知道数组的总大小,但不可能知道每个维度的大小。

只有当我使用明确命名的类型时它才有效: T01 = 0..1; T = 整数数组[T01,T01];

我错过了什么?

测试代码:

type
  t = array[0..1, 0..1] of Integer;

procedure test;
var
  i: PTypeInfo;
  d: TArrayTypeData;
begin
  i := TypeInfo(t);
  assert(i.Kind = tkArray);
  d := GetTypeData(i).ArrayData;
end;

【问题讨论】:

    标签: delphi delphi-2010 rtti


    【解决方案1】:

    您仍然可以使用内置函数 HighLow 获取数组维度。我们以array[0..1,3..4] of Integer为例:

    Low(T) // low bound of first range (0)
    High(T) // high bound of first range (1)
    Low(T[Low(T)]) // low bound of second range (3)
    High(T[Low(T)]) // high bound of second range (4)
    

    在后两者中,可以在索引值中使用任何有效的索引。

    【讨论】:

    • 我在谈论 Delphi 2010 中的新 RTTI ...你确定你理解我的问题吗?
    • @Henri:我做到了,我的意思是你不需要 RTTI 来完成这项任务。如果你坚持使用 RTTI 接口(为什么?),那我就不知道了。
    • 因为我是superobject的作者,json解析器:progdigy.com/?page_id=6我使用RTTI自动将native类型序列化为json。
    • 对于要获取 RTTI 的数组类型(使用 typinfo 单元),您只能使用动态数组(tkDynArray)。所有其他数组类型均已关闭。
    • "tkArray" 可用并且有效,我在我的问题中添加了一个测试代码
    【解决方案2】:

    是的,这是当前生成的 RTTI 信息的限制,您必须有一个类型名称。

    这样的事情是行不通的:

    var
     StrArray :  Array of String;
    

    但以下方法会起作用:

    type
      TStrArray = Array of String;
    var
      StrArray : TStrArray;
    

    我通常会切换我的动态数组以使用新语法 TArray 在 system.pas 单元中定义为,以确保它们确实有名称。

    TArray<T> = array of T;

    因此,针对您的特定问题的解决方法是为该数组声明一个类型名称。

    type
      TMyArray = array[0..1, 0..1] of Integer;
    var
      t : TMyArray;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-02
      • 2022-01-21
      • 2023-04-07
      • 2021-02-03
      • 2017-04-01
      • 2015-06-09
      • 2016-04-07
      • 1970-01-01
      相关资源
      最近更新 更多