Delphi RTTI问题:GetPropInfo在{$ METHODINFO ON}时返回nil?

时间:2008-12-03 23:48:00

标签: delphi rtti

即使使用正确的{$ METHODINFO}指令声明给定的类,GetPropInfo是否有可能返回nil。

  type 
  ... 
  ...
    {$METHODINFO ON}
    TMyClass = class
    private
      fField: integer;
    published
      property Field: integer read fField write fField;
    end;
    {$METHODINFO OFF}
  ...
  ...
  procedure TestRTTI;
  begin
    assert(assigned(GetPropInfo(TMyClass, 'Field')), 'WTF! No RTTI found!');
  end;

2 个答案:

答案 0 :(得分:5)

疑难杂症!似乎这个问题隐藏在我忽略的前瞻声明中。不知道偷偷摸摸的功能。

似乎编译器只考虑生成RTTI的类的第一个声明,所以如果你有这样的前向声明......

  type 
    TMyClass = class;   
    ...    
    ...
    {$METHODINFO ON}
    TMyClass = class
    private
      fField: integer;
    published
      property Field: integer read fField write fField;
    end;
    {$METHODINFO OFF}   
    ...   
    ...   
    procedure TestRTTI;   
    begin
      assert(assigned(GetPropInfo(TMyClass, 'Field')), 'WTF! No RTTI found!');   
    end;

...您将收到断言错误。因此,为了使RTTI正确,需要为正向声明启用{$ METHODINFO}指令,如此处所示....

  type 
    {$METHODINFO ON}
    TMyClass = class;   
    {$METHODINFO OFF}   
    ...    
    ...
    TMyClass = class
    private
      fField: integer;
    published
      property Field: integer read fField write fField;
    end;
    ...   

答案 1 :(得分:1)

我很高兴您找到了解决方案。与$TypeInfo指令是一回事。 Delphi 7帮助说:

  

请注意,如果一个类是前向声明的,那么必须使用$M开关声明该类的第一个声明。

P.S。:$M+/- = $TypeInfo On/Off