【问题标题】:How to know if an object is a generic list如何知道一个对象是否是一个通用列表
【发布时间】:2017-05-04 18:02:27
【问题描述】:

我如何知道一个对象 (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) 创建一个帮助器,如果对象中存在属性添加、清除、项目、计数,则在 RTTI 中搜索。

【问题讨论】:

  • Tuo 可以尝试使用is 关键字,例如if (Sender is TObject) then。您的问题不是很具体,您的意思是 TList 吗?

标签: list delphi generics


【解决方案1】:

很遗憾,您不能在此处使用 is 运算符,因为您正在检查该类是否是泛型类型的任何特化(在您的情况下为 TList&lt;T&gt;)。

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

但是您可以使用一些技巧并分析类型信息/类名。因此,为了检查您的实例是否为 TList&lt;something&gt;,您只需检查类名是否与 TList&lt;*&gt; 匹配,或者它是否继承自它所在的类。

在 Spring4D 中,我们多次需要此功能,因此我将此功能添加到我们的 RTTI 助手中。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 2019-05-09
    • 1970-01-01
    相关资源
    最近更新 更多