2010-08-24 11 views
115

Utilizándolo para comprobar si c es una instancia de TForm.compruebe si la instancia de un tipo

c.GetType().Name.CompareTo("TForm") == 0 

¿Existe un tipo mucho más seguro para hacerlo, además de utilizar una cadena como un parámetro a CompareTo()?

+4

Wow, quien le dijo que hiciera de esa manera ?! ¡Tantos pasos extra! –

+0

Soy principalmente un desarrollador de Java, en el equipo que apenas código en C#. – Lennie

+16

Espero que tampoco lo hagas en Java de esa manera. Los '' instanceof'' y '' is' de Java son formas mucho mejores de hacerlo. – Powerlord

Respuesta

293

Las diferentes respuestas aquí tienen dos significados diferentes.

Si desea comprobar si una instancia es de un tipo exacto continuación

if (c.GetType() == typeof(TForm)) 

es el camino a seguir.

Si desea saber si c es una instancia de TFormo una subclase a continuación, utilizar is/as:

if (c is TForm) 

o

TForm form = c as TForm; 
if (form != null) 

Vale la pena ser claro en su mente acerca cuál de estos comportamientos realmente quieres

+6

Una pequeña nota: use "is" si no quiere usar el resultado del elenco y use "as" si lo hace. –

+5

Con C# 7 puede combinar 'is' y' as' con coincidencia de patrón: 'if (x es TForm tf) {...' – Richard

29
if(c is TFrom) 
{ 
    // Do Stuff 
} 

o si usted planea usar c como TForm, utilice el siguiente ejemplo:

var tForm = c as TForm; 
if(tForm != null) 
{ 
    // c is of type TForm 
} 

El segundo ejemplo solo necesita comprobar si c es del tipo TForm una vez. Donde si comprueba si ve si c es del tipo TForm y luego lo emite, el CLR se somete a un control adicional. Aquí hay un reference.

Editar: robado de Jon Skeet

Si desea asegurarse de c es de TForm y no cualquier clase que hereda de TForm, a continuación, utilizar

if(c.GetType() == typeof(TForm)) 
{ 
    // Do stuff cause c is of type TForm and nothing else 
} 
3

Pruebe lo siguiente

if (c is TForm) { 
... 
} 
0

O

c.getType() == typeOf(TForm) 
-1
bool isValid = c.GetType() == typeof(TForm) ? true : false; 

o simple

bool isValid = c.GetType() == typeof(TForm); 
+0

@slartidan, muy lindo. Esto es claramente útil. – Gabe

+0

En mi humilde opinión: Evitaría una compasión directa (es decir, '=='). En lenguaje orientado a objetos o orientado a herencia, a menos que sepa que su tipo específico nunca se heredará, por ejemplo, de una clase 'sellada '. También: el uso de un operador ternario que regresa (estático/constante) a los valores booleanos me molesta, me molestaría menos si fuera una declaración 'switch'. – SkidRunner

2

Como otros han mencionado, el "es" palabra clave. Sin embargo, si luego vas a lanzarlo a ese tipo, ej.

TForm t = (TForm)c; 

A continuación, se debe utilizar el "como" palabra clave.

p. Ej. TForm t = c as TForm.

continuación, podrá comprobar

if(t != null) 
{ 
// put TForm specific stuff here 
} 

No combinar con tan es porque se trata de una comprobación de duplicados.

7

También, algo en el mismo vano

Type.IsAssignableFrom(Type c) 

"Verdadero si c y el tipo actual representan el mismo tipo, o si la Tipo actual está en la herencia jerarquía de c, o si el Tipo actual es una interfaz que c implementa, o si c es un parámetro de tipo genérico y el Tipo actual representa una de las restricciones de c.

A partir de aquí: http://msdn.microsoft.com/en-us/library/system.type.isassignablefrom.aspx

+0

este también es mi favorito personal. 'typeof (Clase) .IsAssignableFrom (object.getType())' similar al operador 'instanceof' de Java. – SkidRunner

+0

¿Da falso si no están en la misma rama de la jerarquía de herencia, pero existe un operador de conversión? –

+0

Buena pregunta @PaulStelian. No estoy seguro de la parte superior de mi cabeza, pero creo que sería falso en esa situación. Eso sería al menos mi comportamiento esperado. Posiblemente, si existe una conversión implícita, puede ser cierto, pero sería extraño. –

5

Un poco más compacto que las otras respuestas si desea utilizar c como TForm:

if(c is TForm form){ 
    form.DoStuff(); 
} 
Cuestiones relacionadas