2016-01-12 30 views
6

我想獲取記錄字段的類型以創建正確的比較器(作爲任何/幾乎任何記錄類型的一般解決方案)。我無法找到靜態數組類型信息:使用RTTI獲取記錄字段的類型對於靜態數組失敗

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爲任何類型的靜態陣列爲零。 任何想法這裏有什麼不對? 或者也許有更簡單的方法來創建TArray/TDictionary等使用的記錄比較器?

+0

這同樣適用於ShortString類型(David Heffernan的解決方案也適用於他們)。 –

回答

9

您需要聲明一個類型才能使RT​​TI可用。例如:

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

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

有關動態數組的信息可用,無需聲明單獨的類型。在靜態數組的情況下,我們必須聲明單獨的類型,這是唯一的方法?沒有我期望的那麼好,但總比沒有好,謝謝! –

+4

動態數組是一種具有自己的RTTI的編譯器管理類型,它包含具有動態數組RTTI鏈接到的其自身RTTI的不同類型的元素。靜態數組不是一種類型,因此也不是RTTI,除非將其設爲類型,否則它只是一塊內存。 –

+0

如果我沒有記錯,如果要訪問RTTI數組的項目,您還必須將範圍聲明爲'MyStaticArrayOfByteRange = 0..3;'。 –

相關問題