我正在尝试获取记录字段的类型以创建正确的比较器(作为任何/几乎任何记录类型的通用解决方案).我找不到静态数组的类型信息:
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;