对于静态数组,使用RTTI获取记录字段类型失败

And*_*tyn 6 delphi rtti delphi-10-seattle

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

  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;
Run Code Online (Sandbox Code Playgroud)

对于任何类型的静态数组,FieldType都是nil.任何想法在这里有什么不对?或者也许有更简单的方法来创建与TArray/TDictionary等一起使用的记录的比较器?

Dav*_*nan 9

您需要声明一个类型才能使RT​​TI可用.例如:

type
  TMyStaticArrayOfByte = array[0..3] of byte;

  TArrFieldTest = record
    a: string;
    b: TMyStaticArrayOfByte;
  end;
Run Code Online (Sandbox Code Playgroud)

  • 动态数组是具有自己的RTTI的编译器管理类型,并且包含具有其自己的RTTI的不同类型的元素,动态数组的RTTI链接到该RTTI.静态数组不是类型,因此没有RTTI,除非你把它作为一个类型,否则它只是一块内存. (4认同)