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

时间:2013-05-31 14:30:18

标签: 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

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

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

End If

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

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


更新

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

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

4 个答案:

答案 0 :(得分:23)

您可以使用Type.IsAssignableFrom方法。

在VB中:

If GetType(Domain).IsAssignableFrom(GetType(DerivedThree)) Then

在C#中:

if (typeof(Domain).IsAssignableFrom(typeof(DerivedThree)))

答案 1 :(得分:1)

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

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

如果为两个相等的类型;)

调用,则它返回false。

答案 2 :(得分:0)

在C#中(VB也应该这样)你可以用速记来执行检查和使用变量并避免使用转换部分:

var val = x as Domain;

然后像这样使用val

if(val != null)
{
    // use val
}

答案 3 :(得分:-3)

is operator怎么样?

if(obj is Domain)
{
    // 
}