即使使用正确的{$ 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;

最佳答案

知道了!似乎问题隐藏在我忽略的前向声明中。不知道那个偷偷摸摸的功能。

似乎编译器仅考虑该类的第一个声明来生成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;
    ...

关于Delphi RTTI麻烦: GetPropInfo returns nil with {$METHODINFO ON}?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/339172/

10-12 20:46