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を正しく取得するには、ここに示すように、前方宣言に対して{$M​​ETHODINFO}ディレクティブをオンにする必要があります。

  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 に答える