2013-08-09 2 views
2

Я пытаюсь использовать общие записи с RTTI, но столкнулся с проблемой с информацией о типе. Кто-нибудь знает, почему следующее не будет компилироваться с использованием Delphi 2010?Delphi TypeInfo для общих записей

program GenericTypeInfo; 

{$APPTYPE CONSOLE} 

uses 
    TypInfo, 
    SysUtils; 

type 

    TMyRec<T> = record 
    public 
    Value: T; 
    end; 

    TMyInt = TMyRec<Integer>; 
    TMyString = TMyRec<String>; 

begin 

    try 
    Writeln(GetTypeName(TypeInfo(TMyRec<Integer>)));  <--- This works fine 
    Writeln(GetTypeName(TypeInfo(TMyRec<String>)));  <--- so does this 
    Writeln(GetTypeName(TypeInfo(TMyInt)));    <--- BUT this won't compile 
    Writeln(GetTypeName(TypeInfo(TMyString)));   <--- nor this!! 
    except 
    on E: Exception do 
     Writeln(E.ClassName, ': ', E.Message); 
    end; 

    Readln; 

end. 

линии указанные выше генерировать следующие ошибки компилятора:

[DCC Error] GenericTypeInfo.dpr(24): E2134 Type 'TMyInt' has no type info 
[DCC Error] GenericTypeInfo.dpr(24): E2134 Type 'TMyString' has no type info 

Я не могу, что большая разница между 2? Я признаю, что я не эксперт на низком уровне, но почему компилятор относится к этому по-другому? Мне нужно, чтобы он работал для типов TMyInt и TMyString.

Спасибо за любую помощь.

+1

Содержит ли компилятор сообщение об ошибке –

+0

Да, конечно, извините, что я должен был включить это в свой пост: [DCC Error] GenericTypeInfo.dpr (24): E2134 Тип 'TMyInt' не имеет информации о типе –

+2

Когда дело доходит до Generics , Поколение RTTI все еще не завершено на 100%. –

ответ

6

Это bug in Delphi 2010, который был исправлен для XE и выше.

Но есть workaround.

+0

+1 Насколько я понимаю, обходное решение позволяет скомпилировать, но, к сожалению, до сих пор нет информации о типе (метод возвращает nil) ... –

+0

Обходной путь действительно благодарен, но теперь я запущен в тип времени выполнения вопрос с RTTI. Вышеописанное решение возвращает TypeInfo для TMyRec , который, по-видимому, не может быть присвоен свойству TMyString с использованием RTTI & TValue.Make. Есть идеи? Или я должен задать другой вопрос. –

+0

@ArnaudBouchez В статье говорится, что это может быть так, но на самом деле он возвращает действительный TypeInfo в данном конкретном случае. Я предполагаю, что typeinfo/RTTI отсутствует для этого свойства, так как TypeInfo должен быть совместимым (поскольку он точно такой же, как TMyString * - это * TMyRec ) –

3

Этот пример отлично работает в XE2. (И XE как комментарии @StefanGlienke).

RTTI и дженерики в Delphi-2010 не имеют реализации по-разному.

Поскольку интерпретация типов выполняется с помощью магии компилятора, обходным путем является обновление.

+0

Благодарим за информацию и можем быть примером для обновления, но предпочли бы изучить другие решения, прежде чем тратить деньги и потратить много времени на модернизацию других библиотек и т. Д. –

Смежные вопросы