2016-01-12 4 views
6

Sto cercando di ottenere tipi per i campi record per creare un confronto corretto (come soluzione generale per qualsiasi/quasi qualsiasi tipo di record). Non riesco a trovare le informazioni sul tipo per gli array statici:Ottenere il tipo di campo record con RTTI non riesce per gli array statici

TArrFieldTest = record 
    a: string; 
    b: array[0..3] of byte; 
    end; 

procedure Test; 
var 
    rttiContext: TRttiContext; 
    rttiType: TRttiType; 
    rttiFields: TArray<TRttiField>; 
begin 
    rttiType := rttiContext.GetType(TypeInfo(TArrFieldTest)); 
    rttiFields := rttiType.GetFields; 
    Assert(rttiFields[0].FieldType<>nil); // it's ok 
    Assert(rttiFields[1].FieldType<>nil); // fail here! 
end; 

FieldType è pari a zero per la matrice statica di qualsiasi tipo. Qualche idea cosa c'è di sbagliato qui? O forse c'è un modo più semplice per creare un confronto per i record da utilizzare con TArray/TDictionary ecc.?

+0

Lo stesso vale per i tipi di ShortString (e la soluzione di David Heffernan funziona anche per loro). –

risposta

9

È necessario dichiarare un tipo per poter disporre di RTTI. Ad esempio:

type 
    TMyStaticArrayOfByte = array[0..3] of byte; 

    TArrFieldTest = record 
    a: string; 
    b: TMyStaticArrayOfByte; 
    end; 
+0

Le informazioni sugli array dinamici sono disponibili senza dichiarazione di tipo separato. In caso di array statico dobbiamo dichiarare il tipo separato, è l'unico modo? Non buono come mi aspettavo, ma meglio di niente, grazie! –

+4

Un array dinamico è un tipo gestito dal compilatore con il proprio RTTI e contiene elementi di un tipo diverso con il proprio RTTI a cui si collega il collegamento RTTI dell'array dinamico. Un array statico non è un tipo, e quindi nessun RTTI, a meno che non lo si faccia un tipo, altrimenti è solo un blocco di memoria. –

+0

Se non ricordo male, dovrai dichiarare l'intervallo come 'MyStaticArrayOfByteRange = 0..3;' se devi accedere agli elementi dell'array con RTTI. –

Problemi correlati