2010-04-24 9 views
2

Je crée une classe de liste générique qui a un membre de type Array (Array of). Le problème est la destruction de classe, car la classe est supposée être utilisée pour les types d'octets vers les types héritant de TObject.Comment vérifier si TypeIdenitifier (T) est un objet?

Plus précisément:

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; 

Comment puis-je vérifier si T est TObject donc je peux libérer tous les membres si le typeidenitifier est une classe, par exemple?

Répondre

2

Vous pouvez obtenir les informations de type de votre type T avec la fonction magique du compilateur TypeInfo. Il renvoie un pointeur que vous pouvez convertir en PTypeInfo, qui est déclaré dans l'unité TypInfo. Donc:

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

Savez-vous comment puis-je dire au compilateur que c'est TObject? TObject (elem) .Free; donne l'erreur suivante.J'ai aussi essayé avec TObject (Fitems [i]). Gratuit, mais toujours la même erreur - Typecast invalide.Vous le savez ou devrais-je commencer une nouvelle question? –

+0

Je ne suis pas sûr, mais ce que je ferais, c'est d'éviter cela en créant une version séparée de l'objet. Jetez un oeil à 'TList ' et 'TObjectList ' dans Generics.Collections pour voir comment cela est fait. –

Questions connexes