2010-03-09 14 views
9

¿Hay una manera simple de verificar el tipo de un objeto? Necesito algo a lo largo de las siguientes líneas:¿Cómo verificar el tipo de un objeto en C++/CLI?

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

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

Por el momento estoy usando bloques try-catch anidados en busca de System::InvalidCastException s que se siente feo, pero funciona. Intenté y perfilé algo así como el código anterior para ver si es más rápido/lento/legible pero no puedo resolver la sintaxis para intentarlo.

En caso de que alguien se lo esté preguntando, esto se debe a tener una sola cola que ingresa un hilo que suministró datos para trabajar. Ocasionalmente, deseo cambiar las configuraciones y pasarlas a través de la cola de datos es una forma sencilla de hacerlo.

Respuesta

24

Puede usar MyObject::typeid en C++/CLI de la misma manera que typeof(MyObject) se usa en C#. Código de abajo descaradamente copiado de su pregunta y modificado ...

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

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

+ 1/Aceptar: eso es perfecto, ¡gracias! –

+0

¿esto todavía funciona en VS 2010/2012? No viendo ese miembro tipeado ... – bbqchickenrobot

+1

Todavía funciona en VS2010. No tengo VS2012 así que no puedo comentar sobre la última versión de VS. Puede ser que no esté "viendo ese miembro tipeo" porque la autocompleta de C++/CLI no se incluyó en VS2010. – mcdave

9

Debe retirar How to: Implement is and as C# Keywords in C++:

este tema se muestra cómo implementar la funcionalidad de la SI y C# como palabras clave en Visual C++.

+0

¿Hay una manera de hacerlo con los genéricos en lugar de plantillas de modo que el método puede ser utilizado en montajes externos? –

0

editar: Lo dejaré aquí. Pero esta respuesta es para C++. Probablemente ni siquiera ligeramente relacionado con hacer esto para la CLI.

Debe compilar con RTTI (información de tipo de tiempo de ejecución) en. Luego mira el artículo de Wikipedia http://en.wikipedia.org/wiki/Run-time_type_information y busca en Google RTTI. Debería funcionar para usted.

Por otro lado, es posible que desee tener una clase base virtual para todas sus clases de datos con una variable miembro que describa de qué tipo es.

Cuestiones relacionadas