2010-08-11 199 views
3

RttiContext.FindType('Classes.TStringList')我得到RttiType TStringList没有问题。但与RttiContext.FindType('MyUnit.TMyClass')我总是得到零(当然MyUnit是在使用条款)。为什么,什么是错的?德尔福2010 RTTI - RttiContext.FindType

例子:

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 !! 
... 

回答

8

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

  1. 在你的类上声明一个静态方法。这种方法应该是一个空的方法,简单的begin end
  2. 在本机的初始化部分调用此静态方法。
  3. 确保设备在某个地方被引用。
  4. 现在你应该看到与TRttiContext.FindType类。
+0

谢谢,你是对的,类没有包含在可执行文件中!重新启动IDE后,我把我的代码引用TMyClass - GetType(TMyClass),所以类包含在exe中。这就是为什么我得到正确的RttiType! – Branko 2010-08-12 04:19:47

+0

@Branko 很高兴有用。我在使用外部配置文件开发Delphi ORM时遇到了这个“问题”。每个数据库适配器(或业务逻辑类)仅在外部文件中有引用,因此在最终的可执行文件中没有。所以我使用了静态方法。 – 2010-08-12 10:58:48

+0

这是解决此问题的弱方法。因为它迫使你修改这个类。更好的选项可以在这里找到:http://stackoverflow.com/a/10613212/576719 – 2014-10-03 19:30:21

1

这可能是一个事物的屈指可数。很难说没有看到你的代码,但这里有一些建议,看看。 TMyClass是界面部分中的公共类型吗?是否为该单位启用了RTTI生成? MyUnit是否在尚未加载的软件包中?

+0

TMyClass是接口部分的公共类型,不包含运行时包。对于MyUnit,RTTI生成没有明确打开或关闭 - 我该怎么做? – Branko 2010-08-11 16:21:47

+0

为了简化:unit MyUnit;接口使用类;类型TMyClass = class(TStringList)end;实施结束。主单元中的代码:...使用MyUnit,... var oCont:TRttiContext; oType:TRttiType;开始oCont:= TRttiContext.Create;尝试oType:= oCont.FindType('MyUnit.TMyClass'); <== oType = nil !! ... – Branko 2010-08-11 16:37:46

+0

@Branko:好的,尝试oCont.GetType(TMyClass),看看是否有任何东西。这会告诉你RTTI是否存在于课堂上。如果它存在,那么FindType由于某种原因没有找到它。 – 2010-08-11 16:45:29