2017-05-04 70 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<>'); 
相关问题