2011-12-31 65 views
4

數組的元素類型我使用這個代碼來獲得一個數組我怎樣才能使用RTTI

{$APPTYPE CONSOLE}  
uses 
    Rtti, 
    SysUtils; 

type 
    TFooArray= array of TDateTime; 

Var 
    T : TRttiType; 
begin 
    try 
    T:=TRttiContext.Create.GetType(TypeInfo(TFooArray)); 
     Writeln(TRttiArrayType(T).ElementType.Name); 
    except 
    on E: Exception do 
     Writeln(E.ClassName, ': ', E.Message); 
    end; 
end. 

的元素類型,但應用程序失敗,並訪問衝突在這條線

Writeln(TRttiArrayType(T).ElementType.Name); 

如何使用RTTI獲取數組的元素類型?

回答

9

你投錯了TRttiArrayType是靜態數組(和你的陣列是動態的),來解決這個問題使用TRttiDynamicArrayType,而不是像這樣:

Writeln(TRttiDynamicArrayType(T).ElementType.Name); 
+2

而且,這也是值得一說的強制類型轉換' TRttiArrayType(T)'或'TRttiDynamicArrayType(T)'不是一個好習慣。只有當你確信類型匹配時才應該這樣做 - 在你的代碼中不是這種情況。 ('T as TRttiArrayType')可能是有意義的,或者首先測試'如果T是TRttiArrayType,那麼...'執行相同的操作(但不會觸發任何異常),但可以在循環之前創建一次。它將避免任何類似的類型混淆。 – 2011-12-31 10:11:51

+0

同意Arnaud Bouchez,TSomeClass(VarSomeObj)僅適用於'如果VarSomeObj是TSomeClass,那麼使用TSomeClass(VarSomeObj)做某事' – OnTheFly 2011-12-31 12:38:39