如何检查一个类是否继承了另一个类而没有实例化它?

ato*_*erz 130 c# inheritance types

假设我有一个看起来像这样的类:

class Derived : // some inheritance stuff here
{
}
Run Code Online (Sandbox Code Playgroud)

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

Derived is SomeType;
Run Code Online (Sandbox Code Playgroud)

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

PS如果它有帮助,我想要一些where关键字与泛型有关的东西.
编辑:
类似于这个答案,但它正在检查一个对象.我想查看课程本身.

Ani*_*Ani 262

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

typeof(SomeType).IsAssignableFrom(typeof(Derived))
Run Code Online (Sandbox Code Playgroud)

这对于类型相等,继承关系和接口实现的期望是有效的,但是当您在显式/隐式转换运算符中寻找"可分配性"时却不行.

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

typeof(Derived).IsSubclassOf(typeof(SomeType))
Run Code Online (Sandbox Code Playgroud)

  • 就像其他人想知道的那样,就检查泛型类型/接口定义而言,这不会返回true,据我所知,您需要搜索继承链并自己检查泛型类型定义。 (2认同)
  • 对于PCL`typeof(SomeType).GetTypeInfo().IsAssignableFrom(typeof(Derived).GetTypeInfo())` (2认同)
  • 对于那些对顺序有点困惑的人,比如我自己: `typeof(InvalidOperationException).IsAssignableFrom(typeof(Exception)) = false` `typeof(Exception).IsAssignableFrom(typeof(InvalidOperationException)) = true` (2认同)

Har*_*san 19

试试这个

typeof(IFoo).IsAssignableFrom(typeof(BarClass));
Run Code Online (Sandbox Code Playgroud)

这会告诉你是否BarClass(Derived)器具IFoo(SomeType)与否