在Delphi截止XE7的实现中,RTTI信息也并不是特别完美,所以在特定的情况下是无法获取到相应的RTTI信息,目前已知:
1、在implementation中的声明没有RTTI信息,所以你要使用ToRtti/FromRtti/ToRecord/FromRecord等函数,你必需保证用到的类型声明的interface部分。
interface .... type //TMyRecord可以用于RTTI相关函数 TMyRecord= end; .... implementation type //TMyRecord1类型不能用于RTTI相关函数 TMyRecord1= end;
2、类型或对象的子类型如果是数组或动态数组里,应该将声明独立出来,否则,RTTI相关信息将无法有效使用。
如下面的代码无法用于RTTI相关函数:
TMyRecord=record Arr:array of Byte;//这个声明无法用于RTTI相关函数 end; TMyRecord1=record Arr:array[0..1] of Byte;//这个声明也无法用于RTTI相关函数 end;
相应的修改为下面的形式即可:
TMyReocrdArr=array of Byte; TMyRecord=record Arr:TMyReocrdArr; end; TMyRecordArr1=array[0..1] of Byte; TMyRecord1=record Arr:TMyRecordArr1; end;