如果未命名类型,则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;
答案 0 :(得分:1)
您仍然可以使用内置High
和Low
获取数组维度。我们来看示例类型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;