Respuestas:
Las diferentes respuestas aquí tienen dos significados diferentes.
Si desea verificar si una instancia es del tipo exacto, entonces
if (c.GetType() == typeof(TForm))
Es el camino a seguir.
Si desea saber si ces una instancia TForm o una subclase , use is/ as:
if (c is TForm)
o
TForm form = c as TForm;
if (form != null)
Vale la pena tener claro en su mente cuál de estos comportamientos realmente desea.
isy combinar aspatrones:if (x is TForm tf) {…
if(c is TFrom)
{
// Do Stuff
}
o si planea usarlo ccomo a TForm, use el siguiente ejemplo:
var tForm = c as TForm;
if(tForm != null)
{
// c is of type TForm
}
El segundo ejemplo solo necesita verificar si ces de tipo TFormuna vez. Si verifica si ces de tipo y TFormluego lo lanza, el CLR se somete a una verificación adicional. Aquí hay una referencia .
Editar: Robado de Jon Skeet
Si desea asegurarse de que ces de TFormy no de ninguna clase que hereda TForm, use
if(c.GetType() == typeof(TForm))
{
// Do stuff cause c is of type TForm and nothing else
}
Sí, la palabra clave "es":
if (c is TForm)
{
...
}
Ver detalles en MSDN: http://msdn.microsoft.com/en-us/library/scekt9xw(VS.80).aspx
Comprueba si un objeto es compatible con un tipo dado. Por ejemplo, se puede determinar si un objeto es compatible con el tipo de cadena de esta manera:
Además, algo en la misma línea
Type.IsAssignableFrom(Type c)
"Verdadero si c y el Tipo actual representan el mismo tipo, o si el Tipo actual está en la jerarquía de herencia de c, o si el Tipo actual es una interfaz que implementa c, o si c es un parámetro de tipo genérico y el Tipo actual representa una de las restricciones de c ".
Desde aquí: http://msdn.microsoft.com/en-us/library/system.type.isassignablefrom.aspx
typeof(Class).IsAssignableFrom(object.getType())similar al instanceofoperador de Java .
T1.IsAssignableFrom(T2)devuelve trueen situaciones en las asque el operador devuelve un valor no nulo, dadas instancias de esos tipos.
Un poco más compacto que las otras respuestas si desea utilizar c como TForm:
if(c is TForm form){
form.DoStuff();
}
Como otros han mencionado, la palabra clave "es". Sin embargo, si luego lo va a lanzar a ese tipo, por ejemplo.
TForm t = (TForm)c;
Entonces deberías usar la palabra clave "as".
p.ej TForm t = c as TForm.
Entonces puedes verificar
if(t != null)
{
// put TForm specific stuff here
}
No combine como es porque es una verificación duplicada.
bool isValid = c.GetType() == typeof(TForm) ? true : false;
o más simple
bool isValid = c.GetType() == typeof(TForm);
==). En objetos o lenguajes orientados que admitan la herencia a menos que sepa que su Tipo específico nunca se heredará, por ejemplo, de una sealedClase. Además: el uso de un operador ternario que devuelve valores booleanos (estáticos / constantes) me molesta, me molestaría menos si fuera una switchdeclaración.
instanceofy C #isson formas mucho mejores de hacerlo.