2011-12-01 20 views
13

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ć.

+0

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

Odpowiedz

23

Jasne - można użyć Type.IsAssignableFrom:

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

Należy pamiętać, że ważne jest, aby nie dostać cel zaproszenia i argument na odwrót. Muszę skonsultować się z dokumentami za każdym razem, kiedy go używam, co na szczęście rzadko się zdarza :)

+0

Pracował, genialny! – jamesrom

+0

Po prostu nie muszę analizować pytania za każdym razem, gdy znajduję to pytanie w Google co kilka miesięcy, to jest 'if (parentType.IsAssignableFrom (child.GetType()). – Seafish

Powiązane problemy