当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何确定给定的Type(System.Type)是否继承自特定的基类(在.Net中)?》经验,为你挑选了3个好方法。

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



1> chakrit..:

使用System.Type类的IsSubclassOf方法.


我更喜欢`IsInstanceOfType`而不是'IsAssignableFrom`.但是请注意STW的答案,当比较相同类型(未派生)的实例时,这些返回true,其中`IsSubClassOf`将返回`false`.
对于包含接口,最好使用IsAssignableFrom()

2> STW..:

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

IsSubType()true仅当给定类型是从指定类型派生时才会返回.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


实际上,DerivedClassInstance.GetType.IsAssignableFrom(GetType(BaseClass))将返回FALSE.你需要以相反的方式应用它:typeof(BaseClass).IsAssignableFrom(typeof(DerivedClass)).换句话说,您不能执行以下操作:DerivedClass c = new BaseClass(); 这是IsAssignableFrom正在测试的内容

3> Chris Marast..:

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

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

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

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

推荐阅读
coco2冰冰
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有