2016-01-12 13 views
6

Próbuję uzyskać typy pól rekordów w celu utworzenia poprawnego porównywalnika (jako ogólne rozwiązanie dla dowolnego/prawie dowolnego typu rekordu). Nie mogę znaleźć informacji o typie dla tablic statycznych:Uzyskiwanie typu pola rekordu z błędem RTTI dla macierzy statycznych

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 jest zerowa dla statycznej tablicy dowolnego typu. Jakieś pomysły, co tu jest nie tak? A może jest łatwiejszy sposób na stworzenie porównywalnika dla rekordów do użycia z TArray/TDictionary itp.?

+0

To samo dotyczy typów ShortString (rozwiązanie Davida Heffernana również działa na nich). –

Odpowiedz

9

Musisz zadeklarować typ, aby mieć dostęp do RTTI. Na przykład:

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

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

Informacje o tablicach dynamicznych są dostępne bez deklaracji oddzielnego typu. W przypadku macierzy statycznej musimy zadeklarować osobny typ, to jedyny sposób? Nie tak dobre, jak się spodziewałem, ale lepsze niż nic, dziękuję! –

+4

Tablica dynamiczna jest typem zarządzanym przez kompilator z własnym interfejsem RTTI i zawiera elementy innego typu z własnym interfejsem RTTI, do którego łączy się dynamiczna tablica RTTI. Statyczna tablica nie jest typem, a więc nie ma RTTI, chyba że uczynisz go typem, w przeciwnym razie jest to tylko blok pamięci. –

+0

Jeśli dobrze pamiętam, będziesz musiał zadeklarować zakres jako 'MyStaticArrayOfByteRange = 0..3;' jeśli chcesz uzyskać dostęp do elementów tablicy za pomocą RTTI. –

Powiązane problemy