Delphi中类内临时声明静态数组时,RTTI无法获取TRTTIField.FieldType的问题及解决方案咨询
Delphi中类内临时声明静态数组时,RTTI无法获取TRTTIField.FieldType的问题及解决方案咨询
各位Delphi开发者们好,我最近在开发一款组件时碰到了一个RTTI相关的棘手问题,想跟大家请教下有没有可行的解决办法:
我需要通过RTTI机制读取某个类的所有成员变量,但发现一个奇怪的现象:如果类的字段是在类内部直接声明的静态数组类型(也就是没有提前在类外部定义该数组类型),那么TRTTIField.FieldType会返回nil,连F.DataType也是nil,后续访问FieldType.TypeKind时直接触发访问违例(AV)。
复现问题的代码示例
下面是能复现问题的代码:
type TMyClass = class MyArray: array[0..1] of double; // 类内临时声明的静态数组 end; var MyClass: TMyClass; Ctx: TRTTIContext; T: TRTTIType; F: TRTTIField; begin MyClass := TMyClass.Create; Ctx := TRTTIContext.Create; T := Ctx.GetType(MyClass.ClassInfo); for F in T.GetFields do case F.FieldType.TypeKind of // 这里会触发AV,因为F.FieldType为nil tkFloat: ; end; end;
正常工作的对比案例
如果我把数组类型提前在类外部声明,或者使用动态数组,RTTI就能正常获取字段类型:
方案1:提前在类外部定义数组类型
type TMyArr = array[0..1] of double; // 提前声明数组类型 TMyClass = class MyArray: TMyArr; // 使用提前声明的类型 end;
方案2:使用动态数组
type TMyClass = class MyArray: array of double; // 动态数组 end;
我的需求
因为我开发的是通用组件,没办法控制用户如何编写类的声明,所以必须找到一个能处理这种类内临时声明静态数组的 workaround。我已经在Delphi 11和Delphi 12版本上都测试过,问题一致存在。
有没有大佬遇到过类似的问题?或者有什么办法能绕过这个限制,正确获取这类字段的类型信息呢?
备注:内容来源于stack exchange,提问作者Schneider Infosystems Ltd
相关产品推荐
相关产品推荐

