【问题标题】:How to check if TypeIdenitifier(T) is an Object?如何检查 TypeIdenitifier(T) 是否为对象?
【发布时间】:2010-04-24 16:34:39
【问题描述】:

我正在创建一个具有 Array(Array of ) 类型成员的通用列表类。 问题是类破坏,因为该类应该用于从字节到继承TObject的类型。

具体来说:

destructor Destroy;
var elem:T;
begin
  /*if(T is Tobject) then  //Check if T inherits TObject {Compiler error!}
    for elem in FData do TObject(elem).Free;*/    // do not know how to do it

  SetLength(FItems,0); //FItems : Array of T
  inherited Destroy;
end;

如何检查 T 是否为 TObject 以便在类型标识符是类的情况下释放每个成员?

【问题讨论】:

    标签: delphi generics delphi-2009 generic-programming


    【解决方案1】:

    您可以使用 TypeInfo 编译器魔术函数获取类型 T 的类型信息。它返回一个指针,您可以将该指针强制转换为在 TypInfo 单元中声明的 PTypeInfo。所以:

    if PTypeInfo(typeInfo(T)).Kind = tkClass then
      //do whatever
    

    【讨论】:

    • 你知道如何告诉编译器它是TObject吗? TObject(elem).Free;给出下一个错误。我也尝试过 TObject(Fitems[i]).Free ,但仍然是同样的错误 - Invalid typecast。你知道还是我应该开始一个新问题?
    • 不确定,但我要做的是通过制作一个单独的对象版本来完全避免这种情况。查看 Generics.Collections 中的 TList<T> 和 TObjectList<T> 以了解它是如何完成的。
    猜你喜欢
    • 2021-03-20
    • 2017-10-16
    • 1970-01-01
    • 2013-10-11
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 2010-09-27
    相关资源
    最近更新 更多