检查 System.Type 是否是给定类的子类的最佳方法

18

考虑以下代码:

public class A 
{
}  

public class B : A 
{
}  

public class C : B 
{
}  

class D  
{  
    public static bool IsDescendantOf(this System.Type thisType, System.Type thatType)  
    {  
        /// ??? 
    } 

    void Main()
    {
        A cValue = new C();
        C.GetType().IsDescendantOf(cValue.GetType());
    }
}

如何最佳实现IsDescendantOf?

4个回答

27

1
嗯...那也应该很好用。现在我很好奇Type.IsAssignableFrom和Type.IsSubclassOf之间的区别是什么? - sh0gged
1
如果type1是一个接口,那么"type1.IsAssignableFrom(type2)"就能正常工作。 - Kathy Van Stone
现在我猜测Type.IsSubclassOf()更像是我一直在寻找的。:) 谢谢你。 - sh0gged
在我的情况下,System.Type 只能是一个类。 - sh0gged
@sh0gged 这里是区别 - AgentFire
这似乎在WinUAP项目中不可用。 :/ - Gary Paluk

16

这很有用,但是只有在类型完全相同时才会返回 true。赋值兼容性和继承之间存在一些区别。我觉得比起 IsSubClassOf 来说,它更难读懂。 - Sam

5

我知道这并没有直接回答你的问题,但是你可能会考虑使用这个方法来替代你示例中的方法:

public static bool IsDescendantOf<T>(this object o)
{
    if(o == null) throw new ArgumentNullException();
    return typeof(T).IsSubclassOf(o.GetType());
}

那么你可以像这样使用它:

C c = new C();
c.IsDescendantOf<A>();

此外,回答您关于Type.IsSubclassOf和Type.IsAssignableFrom之间区别的问题 - IsAssignableFrom相对较弱,如果有两个对象a和b,使得以下条件成立:
a = b;

那么typeof(A).IsAssignableFrom(b.GetType())是真的 - 因此a可能是b的子类,也可能是接口类型。

相比之下,a.GetType().IsSubclassOf(typeof(B))只有在a是b的子类时才返回true。鉴于您的扩展方法名称,我建议您使用IsSubclassOf而不是IsAssignable;


你的倒数第二段是否正确?我认为如果a = b;是有效的,那么a.GetType().IsAssignableFrom(typeof(b))应该是true。 - Sam

1

我想你正在寻找这个 Type.IsSubclassOf()

编辑:

我不知道你的要求,但也许这是最好的方法:

bool isDescendant = cValue is C;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接