2010-03-09 17 views
9

Existe-t-il un moyen simple de vérifier le type d'un objet? Je besoin de quelque chose le long des lignes suivantes:Comment vérifier le type d'un objet en C++/CLI?

MyObject^ mo = gcnew MyObject(); 
Object^ o = mo; 

if(o->GetType() == MyObject) 
{ 
    // Do somethine with the object 
} 
else 
{ 
    // Try something else 
} 

En ce moment je suis en utilisant des blocs try-catch imbriquées qui cherchent System::InvalidCastException s qui se sent laid, mais fonctionne. J'allais essayer de profiler quelque chose comme le code ci-dessus pour voir si c'est plus rapide/plus lent/lisible mais ne peut pas travailler sur la syntaxe pour essayer.

Au cas où quelqu'un se poserait la question, cela se produirait si une seule file d'attente entrait dans un thread qui fournissait des données sur lesquelles travailler. Parfois, je veux changer les paramètres et les transmettre via la file d'attente de données est un moyen simple de le faire.

Répondre

24

Vous pouvez utiliser MyObject::typeid en C++/CLI de la même manière que typeof(MyObject) est utilisé en C#. Code ci-dessous copié sans vergogne de votre question et modifié ...

MyObject^ mo = gcnew MyObject(); 
Object^ o = mo; 

if(o->GetType() == MyObject::typeid) 
{ 
    // Do somethine with the object 
} 
else 
{ 
    // Try something else 
} 
+0

+ 1/Accepter: C'est parfait - merci! –

+0

cela fonctionne-t-il toujours dans VS 2010/2012? Ne voyant pas ce membre de typeid ... – bbqchickenrobot

+1

Il fonctionne toujours dans VS2010. Je n'ai pas VS2012 donc je ne peux pas commenter la dernière version de VS. Il se peut que vous ne "voyiez pas ce membre de typeid" car la saisie semi-automatique pour C++/CLI n'était pas incluse dans VS2010. – mcdave

9

Vous devriez vérifier How to: Implement is and as C# Keywords in C++:

Cette rubrique montre comment implémenter la fonctionnalité du est-et comme C# mots clés dans Visual C++.

+0

Y at-il un moyen de le faire avec des génériques plutôt que des modèles afin que la méthode peut être utilisée dans des assemblages externes? –

0

edit: Je vais laisser ceci ici. Mais cette réponse est pour C++. Probablement pas même légèrement lié à faire cela pour le CLI.

Vous devez compiler avec RTTI (Run Time Type Information) sur. Ensuite, regardez l'article wikipedia http://en.wikipedia.org/wiki/Run-time_type_information et recherchez google pour RTTI. Devrait travailler pour vous. Par contre, vous pouvez avoir une classe de base virtuelle pour toutes vos classes de données avec une variable membre qui décrit de quel type il s'agit.

Questions connexes