如何在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
相关产品推荐
相关产品推荐

