【问题标题】:How to check if a class inherits another class without instantiating it? [duplicate]如何检查一个类是否继承了另一个类而不实例化它? [复制]
【发布时间】:2012-01-31 17:06:18
【问题描述】:

假设我有一个如下所示的类:

class Derived : // some inheritance stuff here
{
}

我想在我的代码中检查这样的内容:

Derived is SomeType;

但看起来is 运算符需要 Derived 是 Derived 类型的变量,而不是 Derived 本身。 我不想创建 Derived 类型的对象。
如何确保 Derived 在不实例化的情况下继承 SomeType

P.S. 如果有帮助,我想要 where 关键字对泛型所做的那样。
编辑:
类似于this 答案,但它正在检查一个对象。我想检查课程本身。

【问题讨论】:

    标签: c# inheritance types


    【解决方案1】:

    要检查可分配性,您可以使用Type.IsAssignableFrom 方法:

    typeof(SomeType).IsAssignableFrom(typeof(Derived))
    

    这将按照您对类型相等、继承关系和接口实现的期望工作,但当您在显式/隐式转换运算符之间寻找“可分配性”时不会

    要检查严格继承,可以使用Type.IsSubclassOf

    typeof(Derived).IsSubclassOf(typeof(SomeType))
    

    【讨论】:

    • 就像其他人想知道的一样,在检查泛型类型/接口定义时,这不会返回 true,据我所知,您需要搜索继承链并检查泛型类型自己定义。
    • Alex,您将如何搜索泛型类型的继承链来完成此操作?
    • @AlexHopeO'Connor 的注释很重要,我认为有解决方案stackoverflow.com/questions/457676/…
    • 对于 PCL typeof(SomeType).GetTypeInfo().IsAssignableFrom(typeof(Derived).GetTypeInfo())
    • 对于那些对订单有点困惑的人,比如我自己:typeof(InvalidOperationException).IsAssignableFrom(typeof(Exception)) = falsetypeof(Exception).IsAssignableFrom(typeof(InvalidOperationException)) = true
    【解决方案2】:

    试试这个

    typeof(IFoo).IsAssignableFrom(typeof(BarClass));
    

    这会告诉你BarClass(Derived) 是否实现IFoo(SomeType)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-07
      • 1970-01-01
      • 2013-01-07
      • 2013-08-08
      • 2012-05-29
      • 2014-04-30
      相关资源
      最近更新 更多