检查对象类型是否继承抽象类型

检查对象类型是否继承抽象类型

问题描述:

说我有一个对象,someDrink。它可能是CocaColaPepsi类型,它们都继承了抽象Cola(继承Drink)或任何类型的饮料。我有一个方法返回一个最喜欢的饮料的字符串。检查对象类型是否继承抽象类型

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"); 
} 

上面的代码不会工作,因为someCola类型永远不能等于抽象类型。理想情况下,我想这样做:

if (someCola is drinkType) ... 

is关键字只允许一个类名之后。

是否有另一种方法来检查someDrink是否继承给定的类型?

重构不是完全如果您可以建议一个更好的方法来做到这一点,就不会出现问题。

+0

根据[System.Object.GetType](http://msdn.microsoft.com/en-us/)上的文档, library/system.object.gettype.aspx),它返回该对象的* exact *运行时类型。所以它不会在你的情况下返回'Drink'。也许代码调用你的方法有问题。 – Strelok

当然 - 你可以使用Type.IsAssignableFrom

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

需要注意的是,重要的是你没有得到调用和参数的南辕北辙的目标。我必须在每次使用它时查阅文档,幸好很少:)

+0

工作,辉煌! – jamesrom

+0

就这样,我每隔几个月在Google上发现这个问题时都不必解析这个问题,那就是'if(parentType.IsAssignableFrom(child.GetType())'。 – Seafish