2011-12-01 524 views
13

說我有一個對象,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

回答

23

當然 - 你可以使用Type.IsAssignableFrom

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

需要注意的是,重要的是你沒有得到調用和參數的南轅北轍的目標。我必須在每次使用它時查閱文檔,幸好很少:)

+0

工作,輝煌! – jamesrom

+0

就這樣,我每隔幾個月在Google上發現這個問題時都不必解析這個問題,那就是'if(parentType.IsAssignableFrom(child.GetType())'。 – Seafish