Подтвердить что ты не робот

Проверьте, наследует ли тип объектов абстрактный тип

Скажем, у меня есть объект, someDrink. Он может иметь тип CocaCola или Pepsi, который наследует абстрактный 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 данный тип?

Рефакторинг не исключается, если вы можете предложить лучший способ сделать это.

4b9b3361

Ответ 1

Конечно - вы можете использовать Type.IsAssignableFrom:

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

Обратите внимание, что важно, чтобы вы не получили цель вызова и аргумент неправильным образом. Я должен консультироваться с документами каждый раз, когда я его использую, что, к счастью, редко:)