Type Checking en C#: typeof, GetType o is? Cómo no perderse entre tres opciones
\n\nCada desarrollador de C#, tarde o temprano, se enfrenta a la necesidad de verificar el tipo de un objeto. Parecería que no podría ser más sencillo. Pero cuando tienes tres opciones — typeof, GetType() y is — los ojos se pierden y surge la pregunta lógica: "¿Cuál debo elegir?".
Este artículo no es solo un extracto seco de la documentación. Analizaremos cada enfoque con ejemplos reales, identificaremos trampas y daremos recomendaciones claras. Después de leerlo, dejarás de adivinar y sabrás exactamente qué herramienta usar en cada situación. ¡Allá vamos!
\n\n¿Por qué verificar tipos en C#?
\n\nAntes de sumergirnos en los detalles, recordemos por qué es necesario. C# es un lenguaje fuertemente tipado, pero eso no elimina situaciones donde el tipo de un objeto solo se conoce en tiempo de ejecución. Estos son los escenarios más comunes:
\n\n- \n
- Trabajo con interfaces y clases base: Recibes un objeto como
objecto un tipo base, y necesitas conocer su "verdadera naturaleza". \n - Serialización y deserialización: JSON o XML llegan como cadenas y necesitas restaurar un tipo específico. \n
- Reflexión (Reflection): Cuando creas objetos dinámicamente o invocas métodos conociendo solo el nombre del tipo. \n
- Registro y depuración: A veces solo necesitas registrar en el log con qué tipo estás trabajando. \n
Y aquí es donde entran en escena nuestros tres protagonistas. Conozcamos a cada uno más de cerca.
\n\ntypeof — una mirada estática al futuro
\n\ntypeof es un operador que devuelve un objeto System.Type para un tipo conocido en tiempo de compilación. Funciona como un servicio de información: "Dime el nombre de la clase y te daré toda la información sobre ella".
Cómo funciona:
\nType stringType = typeof(string);\nConsole.WriteLine(stringType.FullName); // Salida: System.String\n\nType intType = typeof(int);\nConsole.WriteLine(intType.FullName); // Salida: System.Int32\n\nCaracterística clave: typeof no requiere una instancia del objeto. Es una operación estática. Le dices al compilador: "Tengo el tipo MyClass, dame sus metadatos".
Cuándo usarlo:
\n- \n
- Cuando necesitas el tipo por el nombre de la clase, no por un objeto. \n
- En atributos (por ejemplo,
[AttributeUsage(typeof(MyAttribute))]). \n - En genéricos:
typeof(List<>). \n
Trampa: typeof siempre devuelve el tipo exacto que especificaste en el código. No sabe nada sobre herencia. Si tienes class Dog : Animal { }, entonces typeof(Animal) nunca será typeof(Dog).
GetType() — investigación dinámica
\n\nA diferencia de typeof, el método GetType() se llama sobre una instancia del objeto. Toma el objeto real almacenado en memoria y dice: "¡Ajá, así que esto es lo que realmente eres!".
Ejemplo:
\nobject obj = "¡Hola, mundo!";\nType typeOfObj = obj.GetType();\nConsole.WriteLine(typeOfObj.FullName); // Salida: System.String\n\n// Ahora un truco:\nobject obj2 = 42;\nType typeOfObj2 = obj2.GetType();\nConsole.WriteLine(typeOfObj2.FullName); // Salida: System.Int32\n\nObserva: la variable obj está declarada como object, pero GetType() "ve" a través de este envoltorio y devuelve System.String. Esto es la determinación dinámica de tipos.
Cuándo usarlo:
\n- \n
- Cuando necesitas conocer el tipo exacto de un objeto en tiempo de ejecución. \n
- Para comparar tipos:
obj.GetType() == typeof(MyClass). \n