2011-12-01 12 views
13

Digamos que tengo un objeto, someDrink. Puede ser del tipo CocaCola o Pepsi, que heredan el resumen Cola (que hereda Drink) o cualquier tipo de bebida para el caso. Tengo un método que devuelve una cadena de la bebida más preferida.Compruebe si los objetos tipo heredan un tipo abstracto

public string PreferredDrink(Drink someDrink) 
{ 
    var orderOfPreference = new List<Type> { 
     typeof (Cola), 
     typeof (PurpleDrank), 
     typeof (LemonLimeBitters) 
     ... 
    } 

    foreach (drinkType in orderOfPreference) { 
     if (someDrink.GetType() == drinkType) { 
      return someDrink.ToString() 
     } 
    } 

    throw new Exception("Water will be fine thank you"); 
} 

El código anterior no funcionará, porque el tipo de someCola nunca puede ser igual a un tipo abstracto. Idealmente me gustaría hacer algo como:

if (someCola is drinkType) ... 

Pero la palabra clave is sólo permite un nombre de clase después de ella.

¿Hay alguna otra forma de comprobar si someDrink hereda un tipo determinado?

La refabricación no es totalmente si no puede sugerir una forma mejor de hacerlo.

+0

Umm, de acuerdo con la documentación de [System.Object.GetType] (http://msdn.microsoft.com/en-us/ library/system.object.gettype.aspx), devuelve el * exact * tipo de tiempo de ejecución del objeto. Por lo tanto, nunca devolverá 'Bebe 'en su caso. Tal vez hay algo mal con el código llamando a su método. – Strelok

Respuesta

23

Claro - se puede utilizar Type.IsAssignableFrom:

if (drinkType.IsAssignableFrom(someDrink.GetType())) 

Tenga en cuenta que es importante que usted no consigue el objetivo de la llamada y el argumento al revés. Tengo que consultar los documentos cada vez que lo uso, que afortunadamente raramente :)

+0

¡Trabajado, brillante! – jamesrom

+0

Solo para no tener que analizar la pregunta cada vez que encuentro esta pregunta en Google cada dos meses, eso es 'if (parentType.IsAssignableFrom (child.GetType())'. – Seafish

Cuestiones relacionadas