5

即使给定的类是用正确的 {$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;
4

2 回答 2

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;
    ...   
于 2008-12-04T00:59:43.567 回答
1

我很高兴您找到了解决方案。$TypeInfo指令也是一样的。德尔福 7 帮助说:

请注意,如果一个类是前向声明的,则该类的第一个声明必须使用$Mswitch 声明。

PS:$M+/- = $TypeInfo On/Off

于 2009-03-04T04:58:26.760 回答