【问题标题】:Delphi 2010 RTTI - RttiContext.FindTypeDelphi 2010 RTTI - RttiContext.FindType
【发布时间】:2010-08-11 16:03:23
【问题描述】:

使用RttiContext.FindType('Classes.TStringList') 我可以毫无问题地获得 TStringList 的 RttiType。但是对于RttiContext.FindType('MyUnit.TMyClass'),我总是得到 nil (当然 MyUnit 在 uses 子句中)。为什么,怎么了?

例子:

unit MyUnit; 
interface 
uses 
  Classes; 
type 
  TMyClass = class(TStringList) 
  end; 
implementation 
end. 

Main unit: 
... 
uses 
  MyUnit,
... 
var 
  oCont: TRttiContext; 
  oType: TRttiType; 
begin 
  oCont := TRttiContext.Create; 
  try 
    oType := oCont.FindType('MyUnit.TMyClass'); <== oType = nil !! 
... 

【问题讨论】:

    标签: delphi delphi-2010 rtti


    【解决方案1】:

    可能这个类没有被 delphi 链接器包含在最终的可执行文件中。快速尝试如下:

    1. 在您的类上声明一个静态方法。这个方法应该是一个空方法,一个简单的begin end
    2. 在本单元的初始化部分调用此静态方法。
    3. 确保在您的项目中某处引用了该单元。
    4. 现在您应该看到带有TRttiContext.FindType 的类。

    【讨论】:

    • 谢谢你,你是对的,类没有包含在可执行文件中!重新启动 IDE 后,我在我的代码中引用了 TMyClass - GetType(TMyClass),因此类包含在 exe 中。这就是我得到正确 RttiType 的原因!
    • @Branko 很高兴有用。我在使用外部配置文件开发 Delphi ORM 时遇到了这个“问题”。每个数据库适配器(或业务逻辑类)仅在外部文件中具有引用,因此在最终的可执行文件中没有。所以我使用了静态方法技巧。
    • 这是解决此问题的弱方法。因为它迫使你修改类。可以在这里找到更好的选择:stackoverflow.com/a/10613212/576719
    • 恕我直言,更好的是在初始化部分调用 TMyClass.ClassName 。写一个小评论,说明你为什么要调用该属性。
    【解决方案2】:

    这可能是一些事情。没有看到你的代码很难说,但这里有一些建议。 TMyClass 是 interface 部分中的公共类型吗?是否为该单元打开了 RTTI 生成? MyUnit 是否在尚未加载的包中?

    【讨论】:

    • TMyClass 是接口部分的公共类型,编译时没有运行时包。没有为 MyUnit 显式打开或关闭 RTTI 生成 - 我该怎么做?
    • 简化:单位 MyUnit;接口使用类;类型 TMyClass = 类(TStringList)结束;实施结束。主单元中的代码:...使用 MyUnit,... var oCont: TRttiContext; o类型:TRttiType;开始 oCont := TRttiContext.Create;尝试 oType := oCont.FindType('MyUnit.TMyClass');
    • @Branko:好的,试试 oCont.GetType(TMyClass) 看看有没有什么结果。这将告诉您该课程是否存在 RTTI。如果存在,则 FindType 出于某种原因找不到它。
    • @Mason - 没问题,使用 GetType(TMyClass) 我得到正确的 RttiType,使用 oType.GetMethods / GetProperties 我得到 TStringList、TStrings 的所有方法/属性...
    • @Branko:您可能已经看到 Delphi 的一个问题,它认为源代码比编译的 .dcu 文件更旧。我以前见过。两种解决方案:重启 Delphi,或删除 .dcu 文件并构建您的应用。
    猜你喜欢
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 2012-09-22
    • 2011-04-27
    相关资源
    最近更新 更多