如何知道对象是否是通用列表

时间:2017-05-04 09:27:14

标签: list delphi generics

如何知道对象(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;

Delphi中是否有一些功能,或者我必须为TObject(IsList)创建一个帮助器,如果在对象中存在属性add,clear,items,count,则在RTTI中搜索。

1 个答案:

答案 0 :(得分:3)

很遗憾,您无法在此处使用is运算符,因为您正在检查该类是否是泛型类型的任何特化(在您的情况下为TList<T>)。

由于Delphi没有开放泛型类型的概念(请参阅this question关于它们的.Net),因此并不那么简单。

但是,您可以使用一些技巧并分析typeinfo / classname。因此,为了检查您的实例是否为TList<something>,您只需检查类名是否与TList<*>匹配,或者它是否继承自它的类。

在Spring4D中我们需要这么多次,所以我将这个功能添加到我们的RTTI助手。

看起来像这样(将Spring.Reflection.pas添加到用途中):

TType.GetType(oObject).IsGenericTypeOf('TList<>');