2017-05-04 65 views
1

如何知道對象(TObject)是否爲通用TList<T>如何知道對象是否爲通用列表

我得到的對象可以是TList<TWhateverObject>或只是一個TWhateverObject

也可以是TList<THelloWorld>

在我的代碼我不會用這樣的:

If (oObject is TList<TWhateverObject>) or 
    (oObject is TList<THelloWorld>) 

    then begin 
    oObject.Free; 
    end; 

但如果可能的話多像這樣:

If (oObject.IsList) 
    then begin 
    oObject.Free; 
    end; 

是否有一些有趣的在德爾福爲此,或者我必須創建一個幫助TObject(IsList)在RTTI中搜索屬性添加,清除,項目,計數存在於對象中。

+1

陀可以像'如果(Sender是TObject的)then'了'is'關鍵字嘗試。你的問題不是很具體,你的意思是一個TList? –

回答

3

不幸的是,您不能在這裏使用is運算符,因爲您正在檢查該類是否是泛型類型的任何特化(在您的案例中爲TList<T>)。

由於Delphi沒有開放泛型類型的概念(請參閱this question關於他們在.Net中),它並不那麼簡單。

但是,您可以使用一些技巧並分析typeinfo/classname。因此,爲了檢查您的實例是否爲TList<something>,您只需檢查類名是否匹配TList<*>,或者它是否從類中繼承。

在Spring4D中,我們需要這麼多次,所以我將這個功能添加到了我們的RTTI幫助程序中。

在那裏,它看起來像這樣(加Spring.Reflection.pas的用途):

TType.GetType(oObject).IsGenericTypeOf('TList<>'); 
相關問題