如何知道对象(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中搜索。
答案 0 :(得分:3)
很遗憾,您无法在此处使用is
运算符,因为您正在检查该类是否是泛型类型的任何特化(在您的情况下为TList<T>
)。
由于Delphi没有开放泛型类型的概念(请参阅this question关于它们的.Net),因此并不那么简单。
但是,您可以使用一些技巧并分析typeinfo / classname。因此,为了检查您的实例是否为TList<something>
,您只需检查类名是否与TList<*>
匹配,或者它是否继承自它的类。
在Spring4D中我们需要这么多次,所以我将这个功能添加到我们的RTTI助手。
看起来像这样(将Spring.Reflection.pas
添加到用途中):
TType.GetType(oObject).IsGenericTypeOf('TList<>');