User u = new User();
Type t = typeof(User);

u is User -> returns true

u is t -> compilation error

¿Cómo puedo probar si una variable es de algún tipo de esta manera?

InformationsquelleAutor Karan | 2012-05-02

4 Comentarios

  1. 182

    Las otras respuestas, todas contienen importantes omisiones.

    La is operador no no comprobar si el tipo en tiempo de ejecución del operando es exactamente el tipo; por el contrario, se comprueba si el tipo en tiempo de ejecución es compatible con el tipo dado:

    class Animal {}
    class Tiger : Animal {}
    ...
    object x = new Tiger();
    bool b1 = x is Tiger; //true
    bool b2 = x is Animal; //true also! Every tiger is an animal.

    Pero la comprobación de tipo identidad con la reflexión de los cheques para identidad, no para compatibilidad

    bool b3 = x.GetType() == typeof(Tiger); //true
    bool b4 = x.GetType() == typeof(Animal); //false! even though x is an animal

    Si eso no es lo que usted desea, entonces usted probablemente querrá IsAssignableFrom:

    bool b5 = typeof(Tiger).IsAssignableFrom(x.GetType()); //true
    bool b6 = typeof(Animal).IsAssignableFrom(x.GetType()); //true! A variable of type Animal may be assigned a Tiger.
    • Mientras que el último método que se muestra aquí funciona, es innecesariamente detallado. typeof(Animal).IsInstanceOfType(x) es más corto y más directo que typeof(Animal).IsAssignableFrom(x.GetType()); (y Resharper le sugieren el uso de la antigua si usa la última).
    • ACLARACIÓN: para responder a la pregunta original, sustituto t para typeof(Animal). Así lo Marca la mejora de la forma se convierte en t.IsInstanceOfType(x).
  2. 13

    GetType() existe en cada tipo de marco de trabajo, ya que se define sobre la base de object tipo. Así que, independientemente de el tipo en sí, se puede utilizar para devolver el subyacente Type

    Así, todo lo que necesitas hacer es:

    u.GetType() == t
    • Eric la respuesta de abajo es mucho mejor – por favor, lea.
    • En realidad Eric respuesta es útil y todo, pero no responder a la pregunta de cómo probar con un tipo desconocido en la «u es t» de la manera descrita en la pregunta original, y lo mismo con el suyo.
    • No exactamente. Dave respuesta es correcta sólo si quieres excluir subclases de t. Eric la respuesta de la mayoría explica qué hacer; es sólo falta de aclaración de donde poner «t». Voy a añadir un comentario allí.
  3. 9

    Usted necesita para ver si el Tipo de la instancia es igual al Tipo de la clase. Para obtener el tipo de la instancia de utilizar el GetType() método:

     u.GetType().Equals(t);

    o

     u.GetType.Equals(typeof(User));

    debe hacerlo. Obviamente, usted podría usar ‘==’ a hacer la comparación, si lo prefiere.

    • +1, Pero prefiero la segunda elección. u.GetType.Equals(typeof(User));
    • Una razón de esto es menos seguro que el uso de == – es que si GetType() de alguna manera, devuelve null – se va a tirar.
    • sí, yo creo que hace el código más fácil de leer si el tipo está en línea, que es la razón por la que he publicado que, aunque en la OPs ejemplo de que ya tiene una variable t que contiene el tipo.
    • si GetType devuelve null, entonces yo estaría preocupado de que un montón de cosas le empiezan a tirar… pero uno de los puntos, que son, por supuesto, a la derecha
    • Sí – La única situación en la que esto iba a suceder, sería si alguien pasó por un tipo de base, y la pata de la implementación de alguna manera. Sería raro, seguro.
  4. 4

    Con el fin de comprobar si un objeto es compatible con un determinado tipo de variable, en lugar de escribir

    u is t

    usted debe escribir

    typeof(t).IsInstanceOfType(u)
    • ¿Cuál es el beneficio de la más detallado de la sintaxis frente a la ‘u es t’ sintaxis?
    • Si usted tuvo Tipo foo; Objeto; no puede escribir Un «foo», pero usted puede escribir foo.isInstanceOfType(A)

Dejar respuesta

Please enter your comment!
Please enter your name here