如何确定类型是否在继承层次结构中

XN1*_*N16 8 c# vb.net inheritance

我需要确定一个对象在其继承层次结构中是否具有特定类型,但是我找不到一个好方法.

我的类的一个非常基本的示例版本是:

Public Class Domain

End Class

Public Class DerivedOne
    Inherits Domain

End Class

Public Class DerivedTwo
    Inherits DerivedOne

End Class

Public Class DerivedThree
    Inherits Domain

End Class
Run Code Online (Sandbox Code Playgroud)

以下确实有效,但在我看来并不是很优雅.此外,创建的继承级别越多,需要完成的检查越多,并且很容易忘记这段代码需要更新.

If GetType(T) Is GetType(Domain) OrElse _
    GetType(T).BaseType Is GetType(Domain) OrElse _
    GetType(T).BaseType.BaseType Is GetType(Domain) Then

End If
Run Code Online (Sandbox Code Playgroud)

有没有办法在T的继承层次结构中获得"域类型"?

(C#或VB.NET欢迎回答)


UPDATE

由于我自己的白痴,我错过了一点重要的信息!

T是一个Type对象(来自类'泛型类型)

Dan*_*zey 25

您可以使用该Type.IsAssignableFrom方法.

在VB中:

If GetType(Domain).IsAssignableFrom(GetType(DerivedThree)) Then
Run Code Online (Sandbox Code Playgroud)

在C#中:

if (typeof(Domain).IsAssignableFrom(typeof(DerivedThree)))
Run Code Online (Sandbox Code Playgroud)

  • 我注意到这个方法正确命名.原始海报要求一种方法来确定一种类型是否在另一种类型的继承层次*中; 这种方法没有回答这个问题.该方法回答了问题"是否可以将一种类型的实例分配给另一种类型的变量?" 这是一个不同的问题.可以将`List <Giraffe>`分配给`IEnumerable <Animal>`类型的变量,但`IEnumerable <Animal>`不会出现在`List <Giraffe>`的继承层次结构中. (3认同)

flo*_*eld 6

为什么没人提及Type.IsSubclassOf(Type)

https://learn.microsoft.com/en-us/dotnet/api/system.type.issubclassof?view=netframework-4.7.2

小心,如果调用两个相等的类型,它会返回 false;)