este problema se puede abordar de diversas maneras, sin embargo te dejamos la solución más completa en nuestra opinión.
typeof
es un operador para obtener un tipo conocido en tiempo de compilación (o al menos un parámetro de tipo genérico). El operando de typeof
es siempre el nombre de un tipo o parámetro de tipo – nunca una expresión con un valor (por ejemplo, una variable). Consulte la especificación del lenguaje C# para obtener más detalles.
GetType()
es un método que llamas a objetos individuales, para obtener el Tiempo de ejecución tipo del objeto.
Tenga en cuenta que a menos que Ud. solo quiere exactamente instancias de TextBox
(en lugar de instancias de subclases) normalmente usaría:
if (myControl is TextBox)
// Whatever
O
TextBox tb = myControl as TextBox;
if (tb != null)
// Use tb
typeof
se aplica a un nombre de tipo o parámetro de tipo genérico conocido en tiempo de compilación (dado como identificador, no como string). GetType
se llama en un objeto en tiempo de ejecución. En ambos casos el resultado es un objeto del tipo System.Type
que contiene metainformación sobre un tipo.
Ejemplo donde los tipos de tiempo de compilación y tiempo de ejecución son iguales
string s = "hello";
Type t1 = typeof(string);
Type t2 = s.GetType();
t1 == t2 ==> true
Ejemplo donde los tipos de tiempo de compilación y tiempo de ejecución son diferente
object obj = "hello";
Type t1 = typeof(object); // ==> object
Type t2 = obj.GetType(); // ==> string!
t1 == t2 ==> false
es decir, el tipo de tiempo de compilación (static tipo) de la variable obj
no es lo mismo que el tipo de tiempo de ejecución del objeto al que hace referencia obj
.
Tipos de prueba
Sin embargo, si sólo desea saber si mycontrol
es un TextBox
entonces puedes simplemente probar
if (mycontrol is TextBox)
Tenga en cuenta que esto no es completamente equivalente a
if (mycontrol.GetType() == typeof(TextBox))
porque mycontrol
podría tener un tipo que se deriva de TextBox
. En ese caso, la primera comparación produce true
y el segundo false
! La primera y más fácil variante está bien en la mayoría de los casos, ya que un control derivado de TextBox
hereda todo lo que TextBox
tiene, probablemente le agrega más y, por lo tanto, es compatible con la asignación TextBox
.
public class MySpecializedTextBox : TextBox
MySpecializedTextBox specialized = new MySpecializedTextBox();
if (specialized is TextBox) ==> true
if (specialized.GetType() == typeof(TextBox)) ==> false
Fundición
Si tiene la siguiente prueba seguida de un lanzamiento y T es anulable…
if (obj is T)
T x = (T)obj; // The casting tests, whether obj is T again!
...
… puedes cambiarlo a …
T x = obj as T;
if (x != null)
...
Probar si un valor es de un tipo dado y convertir (lo que implica esta misma prueba nuevamente) puede llevar mucho tiempo para largas cadenas de herencia. Utilizando el as
operador seguido de una prueba de null
es más eficaz.
A partir de C# 7.0, puede simplificar el código utilizando la coincidencia de patrones:
if (obj is T t)
// t is a variable of type T having a non-null value.
...
Por cierto: esto también funciona para los tipos de valor. Muy útil para probar y desempaquetar. Tenga en cuenta que no puede probar tipos de valores anulables:
if (o is int? ni) ===> does NOT compile!
Esto se debe a que el valor es null
o es un int
. esto funciona para int? o
así como para object o = new Nullable
:
if (o is int i) ===> OK!
Me gusta, porque elimina la necesidad de acceder a la Nullable
propiedad.
typeOf es una palabra clave de C# que se usa cuando tiene el nombre de la clase. Se calcula en tiempo de compilación y, por lo tanto, no se puede usar en una instancia, que se crea en tiempo de ejecución. GetType es un método de la clase de objeto que se puede usar en una instancia.
Reseñas y calificaciones
Si para ti ha sido provechoso nuestro artículo, te agradeceríamos que lo compartas con más programadores de esta forma nos ayudas a difundir esta información.