GetType
le consigue el tipo de tiempo de ejecución exacto de un objeto. Desde el documentation:
la instancia de tipo que representa el tipo exacto de tiempo de ejecución de la instancia actual.
También puede utilizar is
para determinar si un objeto es una instancia de un tipo específico:
var noise = (obj is Velociraptor) ? "SKREEE!" : "<unknown>";
¿Por qué necesita el tipo de ejecución exacta, sin embargo? El objetivo de una interfaz es que debe ocultar los detalles de implementación detrás de la interfaz común. Si necesita realizar una acción según el tipo, es una gran pista de que está violando la encapsulación que proporciona.
Una alternativa es el uso de polimorfismo:
public interface IVocalizer { string Talk(); }
public class Doorbell : IVocalizer {
public string Talk() { return "Ding-dong!" }
}
public class Pokemon : IVocalizer {
public string Talk() {
var name = this.GetType().ToString();
return (name + ", " + name + "!").ToUpper(); } // e.g., "PIKACHU, PIKACHU!"
}
public class Human : IVocalizer {
public string Talk() { return "Hello!"; }
}
Dado que estos tres tipos no están relacionados en absoluto, herencia de un tipo común no tiene sentido. Pero para representar que comparten la misma capacidad de hacer ruido, podemos usar la interfaz IVocalizer, y luego pedir a cada uno que haga ruido. Este es un enfoque mucho más limpio: ahora que no es necesario preocuparse de qué tipo es el objeto cuando se quiere pedir que se haga un ruido:
IVocalizer talker = new ???(); // Anything that's an IVocalizer can go here.
// elsewhere:
Console.WriteLine(talker.Talk()); // <-- Now it doesn't matter what the actual type is!
// This will work with any IVocalizer and you don't
// need to know the details.
Por cierto Pokemon dices: D – Tarik
Acabo de darme cuenta de cuánto polimorfismo malo he cometido en mi aplicación. ¡MAL programador! Tengo un montón de declaración de caso para volver a configurar. – BigChrisDiD
Excepto si es un tipo que admite nulos, entonces GetType devuelve el * Tipo subyacente * del objeto, no el tipo anulable –