Как проверить, является ли TypeIdenitifier(T) объектом?

Я создаю общий класс списка, который имеет член типа Array(Array of ). Проблема заключается в уничтожении класса, потому что класс предполагается использовать для типов от byte до типов, наследующих 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, чтобы я мог освободить каждого члена, например, если идентификатор типа является классом?


person Ivan Prodanov    schedule 24.04.2010    source источник


Ответы (1)


Вы можете получить информацию о типе вашего типа T с помощью магической функции компилятора TypeInfo. Он возвращает указатель, который вы можете привести к PTypeInfo, объявленному в модуле TypInfo. Так:

if PTypeInfo(typeInfo(T)).Kind = tkClass then
  //do whatever
person Mason Wheeler    schedule 24.04.2010
comment
Знаете ли вы, как я могу сказать компилятору, что это TObject? TObject(элемент).Free; выдает следующую ошибку. Я также пробовал с TObject (Fitems [i]). Free, но все равно та же ошибка - Invalid typecast. Знаете ли вы это или мне следует начать новый вопрос? - person Ivan Prodanov; 24.04.2010
comment
Не уверен, но я бы вообще избежал этого, создав отдельную версию объекта. Взгляните на TList<T> и TObjectList<T> в Generics.Collections, чтобы увидеть, как это делается. - person Mason Wheeler; 24.04.2010