Powiedz, że mam obiekt, someDrink
. Może to być typ CocaCola
lub Pepsi
, które dziedziczą po abstrakcji Cola
(która dziedziczy po Drink
) lub dowolny rodzaj napoju. Mam metodę, która zwraca ciąg najbardziej preferowanego napoju.Sprawdź, czy typ obiektów dziedziczy abstrakcyjny typ
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");
}
Powyższy kod nie zadziała, ponieważ typ someCola
nigdy nie może być równa streszczenie typu. Idealnie chciałabym zrobić coś takiego:
if (someCola is drinkType) ...
ale kluczowe is
pozwala tylko nazwę klasy po niej.
Czy istnieje inny sposób sprawdzenia, czy someDrink
dziedziczy dany typ?
Refaktoryzacja nie jest całkowicie z pytanie, czy można zaproponować lepszy sposób to zrobić.
Umm, zgodnie z dokumentacją na [System.Object.GetType] (http://msdn.microsoft.com/en-us/ library/system.object.gettype.aspx), zwraca * dokładnie * typ środowiska wykonawczego obiektu. Więc nigdy nie zwróci "Drink" w twoim przypadku. Może coś jest nie tak z kodem wywołującym twoją metodę. – Strelok