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

如何在Delphi中无需创建虚拟引用即可生成RTTI?

解决Delphi未引用类的RTTI被优化移除问题

针对你遇到的未引用类RTTI丢失的问题,有两种优雅的解决方案,无需创建虚拟实例或显式引用:

1. 使用{$STRONGLINKTYPES ON}编译指令

这个指令会强制编译器链接单元内所有声明的类型,无论是否被代码引用,从而避免RTTI被优化移除。你可以将其放在单元的interface段开头,或者项目文件中全局生效:

{$STRONGLINKTYPES ON}
unit MyTypesUnit;

interface

type
  TMyObject = class(TObject)
  public
    Title: String;
  end;

implementation

// 单元实现代码

如果只想让该指令对部分代码生效,可以用开关包裹特定类型声明:

unit MyTypesUnit;

interface

{$STRONGLINKTYPES ON}
type
  TMyObject = class(TObject)
  public
    Title: String;
  end;
{$STRONGLINKTYPES OFF}

// 其他无需强制链接的类型

2. 给类添加[WeakLinkType(False)]属性

如果只想针对单个类生效,而非整个单元,可以使用WeakLinkType属性标记该类,禁止编译器对其进行弱链接优化:

unit MyTypesUnit;

interface

type
  [WeakLinkType(False)]
  TMyObject = class(TObject)
  public
    Title: String;
  end;

implementation

补充:确保RTTI包含所需成员

即使保留了类的RTTI,默认情况下Delphi仅为published字段生成RTTI信息。如果需要public字段(如示例中的Title)也能被RTTI查询到,需要调整{$RTTI}编译指令,指定字段的可见性范围:

{$RTTI EXPLICIT METHODS([vcPublic, vcPublished]) PROPERTIES([vcPublic, vcPublished]) FIELDS([vcPublic, vcPublished])}
unit MyTypesUnit;

interface

type
  [WeakLinkType(False)]
  TMyObject = class(TObject)
  public
    Title: String;
  end;

implementation

这样配置后,调用TRttiContext.GetTypes就能正常获取到TMyObject的类型信息,以及其Title字段的RTTI数据。

内容的提问来源于stack exchange,提问作者zeus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 09:33:24