Rtti не работает с обобщенными типами, используемыми в качестве полей класса - PullRequest
7 голосов
/ 06 декабря 2011

У меня были проблемы с использованием rtti для получения информации о полях класса универсального типа. После долгих поисков я нашел в QC запись, описывающую проблему. Мой вопрос, если кто-нибудь знает обходной путь, или если это исправлено Delphi XE2. Ниже приведен фрагмент исходного кода из QC для воспроизведения ошибки.

program Generics;

    {$APPTYPE CONSOLE}

    uses
       Generics.Collections, Rtti, SysUtils;

    type
       TIntList = TList<Integer>;

       TRecContainer = record
         FList: TIntList;
       end;

       TObjContainer = class
         FList: TIntList;
       end;

    var
       ctx: TRttiContext;
       f: TRttiField;

    begin
       ctx := TRttiContext.Create;
       try
         for f in ctx.GetType(TypeInfo(TRecContainer)).GetFields do
           if f.FieldType <> nil then
             writeln(f.FieldType.Name)
           else
             writeln('f.FieldType = nil');
         for f in ctx.GetType(TypeInfo(TObjContainer)).GetFields do
           if f.FieldType <> nil then
             writeln(f.FieldType.Name)
           else
             writeln('f.FieldType = nil');
       finally
         ctx.Free;
         readln;
       end;
    end.

1 Ответ

8 голосов
/ 06 декабря 2011

К сожалению, эта ошибка все еще присутствует в Delphi XE2, в качестве обходного пути вы можете объявить тип TIntList следующим образом

TIntList = class(TList<Integer>);
...