You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 07:09:33