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

时间:2008-09-24 19:21:40

标签: c# .net reflection inheritance

这可能是一个简单的答案,我只是遗漏了一些东西,但是这里......如果我有一个Type,(即一个实际的System.Type ......不是一个实例)怎么办?我告诉它是否继承了另一种特定的基类型?

3 个答案:

答案 0 :(得分:32)

使用IsSubclassOf类的System.Type方法。

答案 1 :(得分:23)

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

    仅当给定类型来自时,
  • IsSubType()才会返回true 指定的类型。如果给定类型 IS ,它将返回false 指定的类型。

  • 如果给定的类型是,则
  • IsAssignableFrom()将返回true 指定类型或从指定类型派生。

因此,如果您使用这些来比较BaseClassDerivedClass(继承自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

答案 2 :(得分:22)

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

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

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

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