如何确定给定的Type(System.Type)是否继承自特定的基类(在.Net中)?

时间:2020-03-06 14:41:01  来源:igfitidea点击:

这很可能是一个简单的答案,我只是想漏掉一些东西,但是这里...如果我有一个Type(即实际的System.Type ...不是实例),我该如何判断它从另一个特定的基本类型继承?

解决方案

编辑:请注意,如果我们要查找的基本类型是接口,则上述解决方案将失败。以下解决方案适用于任何类型的继承,无论是类还是接口。

// Returns true if "type" inherits from "baseType"
public static bool Inherits(Type type, Type baseType) {
    return baseType.IsAssignableFrom(type)
}

(半)来自MSDN文章的有用摘录:

如果[自变量]和当前类型表示相同的类型,或者当前类型在[自变量]的继承层次结构中,或者当前类型是[自变量]实现的接口,或者[参数]是通用类型参数,当前类型表示[参数]的约束之一。如果这些条件都不为真,或者[argument]为空引用(在Visual Basic中为Nothing),则返回false。

使用System.Type类的IsSubclassOf方法。

需要澄清的是Type.IsSubTypeOf()和Type.IsAssignableFrom()之间的一件事:

  • 仅当给定类型派生自指定类型时,IsSubType()才会返回true。如果给定类型为指定类型,它将返回false。
  • 如果给定类型是指定类型或者从指定类型派生,则IsAssignableFrom()将返回true。

因此,如果我们使用它们比较BaseClass和DerivedClass(继承自BaseClass),则:

BaseClassInstance.GetType.IsSubTypeOf(GetType(BaseClass)) = FALSE
BaseClassInstance.GetType.IsAssignableFrom(GetType(BaseClass)) = TRUE

DerivedClassInstance.GetType.IsSubTypeOf(GetType(BaseClass)) = TRUE
DerivedClassInstance.GetType.IsAssignableFrom(GetType(BaseClass)) = TRUE