【问题标题】:Check if objects type inherits an abstract type检查对象类型是否继承了抽象类型
【发布时间】:2012-01-10 08:57:16
【问题描述】:

假设我有一个对象,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 是否继承给定类型?

如果您能提出更好的方法,重构并不是完全不可能的。

【问题讨论】:

  • 嗯,根据System.Object.GetType 上的文档,它返回对象的exact 运行时类型。所以在你的情况下它永远不会返回Drink。调用你的方法的代码可能有问题。

标签: c# types


【解决方案1】:

当然 - 你可以使用Type.IsAssignableFrom:

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

请注意,不要以错误的方式获取调用的目标和参数,这一点很重要。每次使用时我都必须查阅文档,幸运的是,这种情况很少:)

【讨论】:

  • 这样我就不必每隔几个月在 Google 上找到这个问题时都解析这个问题,那就是 if (parentType.IsAssignableFrom(child.GetType())
猜你喜欢
  • 2011-03-06
  • 2016-10-14
  • 2012-10-09
  • 1970-01-01
  • 2023-04-03
  • 2016-12-02
  • 2021-07-05
  • 2021-01-23
  • 2011-09-26
相关资源
最近更新 更多