unamed数据类型没有RTTI

时间:2010-01-26 08:44:51

标签: delphi delphi-2010 rtti

如果未命名类型,则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;

2 个答案:

答案 0 :(得分: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)

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

答案 1 :(得分:1)

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

这样的事情不起作用:

var
 StrArray :  Array of String;

但以下方法可行:

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

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

TArray<T> = array of T;

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

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