Jul. 21st, 2007
Повбывал бы за отсутствие документации по дельфёвому RTTI. То немного, что удалось вытащить из неё, это то, что проперши, точнее, TPropInfo может иметь тип, точнее, TTypeKind следующих видов:
И ещё надо не забыть про версионинг, хотя ещё не уверен, нужен ли он тут.
tkUnknown, tkInteger, tkChar, tkEnumeration, tkFloat, tkString, tkSet, tkClass, tkMethod, tkWChar, tkLString, tkWString, tkVariant, tkArray, tkRecord, tkInterface, tkDynArray
Дальше надо уже лезть в TypInfo.pas и ныкаться по всяким форумам. Но вот из того же TypInfo.pas совершенно непонятно, как по тому, что у нас есть экземпляр записи TTypeInfo с TTypeKind tkRecord, то есть, проперти-запись, узнать поля этой записи. Или по массиву узнать его характеристики (хотя, для массива таки есть GetTypeData (у которого, кстати, превосходный исходнк:function GetTypeData(TypeInfo: PTypeInfo): PTypeData;
asm
{ -> EAX Pointer to type info }
{ <- EAX Pointer to type data }
{ it's really just to skip the kind and the name }
XOR EDX,EDX
MOV DL,[EAX].TTypeInfo.Name.Byte[0]
LEA EAX,[EAX].TTypeInfo.Name[EDX+1]
end;), который выдаёт TTypeData — монструозную структуру, в которой таки есть размер динамического массива и тип элементов, но у типа тип PPTypeInfo, и что пока с этим делать, не совсем понятно, хотя…). На самом деле, обе проблемы обходятся (первая — вложенным сериализуемым классом, структура которого повторяет структуру записи, вторая — сериализуемым списком сериализуемых объектов), но как-то коряво.И ещё надо не забыть про версионинг, хотя ещё не уверен, нужен ли он тут.