Rtti не работает с универсальными типами, используемыми в качестве полей класса.

У меня были проблемы с использованием rtti для получения информации о полях класса универсального типа. После некоторого поиска в Google я нашел запись в 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.

person iamjoosy    schedule 06.12.2011    source источник
comment
Ну, я могу подтвердить, что это не работает в XE2.   -  person LU RD    schedule 06.12.2011


Ответы (1)


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

TIntList = class(TList<Integer>);
person RRUZ    schedule 06.12.2011
comment
Спасибо, это решило мою проблему (Сериализация с помощью Коллекции) - person iamjoosy; 07.12.2011