对于静态数组,使用 RTTI 获取记录字段类型失败
Getting type of record field with RTTI fails for static arrays
我正在尝试获取记录字段的类型以创建正确的比较器(作为 any/almost 任何记录类型的通用解决方案)。我找不到静态数组的类型信息:
TArrFieldTest = record
a: string;
b: array[0..3] of byte;
end;
procedure Test;
var
rttiContext: TRttiContext;
rttiType: TRttiType;
rttiFields: TArray<TRttiField>;
begin
rttiType := rttiContext.GetType(TypeInfo(TArrFieldTest));
rttiFields := rttiType.GetFields;
Assert(rttiFields[0].FieldType<>nil); // it's ok
Assert(rttiFields[1].FieldType<>nil); // fail here!
end;
对于任何类型的静态数组,FieldType 为 nil。
任何想法这里有什么问题?
或者也许有更简单的方法来为要与 TArray/TDictionary 等一起使用的记录创建比较器?
您需要声明一个类型才能使 RTTI 可用。例如:
type
TMyStaticArrayOfByte = array[0..3] of byte;
TArrFieldTest = record
a: string;
b: TMyStaticArrayOfByte;
end;
我正在尝试获取记录字段的类型以创建正确的比较器(作为 any/almost 任何记录类型的通用解决方案)。我找不到静态数组的类型信息:
TArrFieldTest = record
a: string;
b: array[0..3] of byte;
end;
procedure Test;
var
rttiContext: TRttiContext;
rttiType: TRttiType;
rttiFields: TArray<TRttiField>;
begin
rttiType := rttiContext.GetType(TypeInfo(TArrFieldTest));
rttiFields := rttiType.GetFields;
Assert(rttiFields[0].FieldType<>nil); // it's ok
Assert(rttiFields[1].FieldType<>nil); // fail here!
end;
对于任何类型的静态数组,FieldType 为 nil。 任何想法这里有什么问题? 或者也许有更简单的方法来为要与 TArray/TDictionary 等一起使用的记录创建比较器?
您需要声明一个类型才能使 RTTI 可用。例如:
type
TMyStaticArrayOfByte = array[0..3] of byte;
TArrFieldTest = record
a: string;
b: TMyStaticArrayOfByte;
end;