2010-05-24 16 views
6

Quiero comparar el tipo de un objeto con un tipo para ver si son los mismos. No tengo el objeto, solo el tipo del objeto.¿Cómo funciona el operador "es" internamente

que puedo hacer type1 == type2 y obtener la igualdad en general

puedo tener un bucle recursivo donde repito el paso anterior para type1.BaseType hasta que el BaseType es nulo.

que puedo hacer type1.GetInterface(type2.FullName) != null para comprobar si tipo2 es una interfaz de tipo 1

Si lo pongo todo junto, me sale

if (type2.IsInterface) 
    return type1.GetInterface(type2.FullName) != null; 

while (type1 != null) { 
    if (type1 == type2) 
    return true; 

    type1 = type1.BaseType; 
} 
return false; 

es que toda la palabra clave es is. No puedo encontrar la palabra clave correcta para tapar en la búsqueda del reflector para encontrar la función y una búsqueda en Google sobre "es" no era realmente útil

+9

Depende de lo que 'es' el significado de la palabra es –

+0

1 interesante. Sin embargo, supongo que la palabra clave "es" se implementa de forma nativa en el tiempo de ejecución y no utiliza la reflexión. – tster

+3

Nunca pensé que vería una cita relevante de Bill Clinton en SO. –

Respuesta

6

is (§14.9.10 de the standard) utiliza generalmente isinst, pero no lo hace necesario si el tipo de tiempo de compilación es compatible a través de ciertas conversiones.

Un equivalente (en reversa) con un objeto Type es IsAssignableFrom. Todas estas son verdaderas:

"foo" is String; 
"foo" is object; 

typeof(String).IsAssignableFrom("foo".GetType()); 
typeof(object).IsAssignableFrom("foo".GetType()); 
+1

Tenga cuidado, una instrucción 'isinst' no siempre se genera. El compilador de C# puede decir cuándo estás siendo tonto y generará comparaciones con null en lugar de 'isinsts'. –

Cuestiones relacionadas