获取基本类型的所有后代最后?(Get all last descendants of a base

2019-10-18 14:17发布

这个问题是相反的如何查找是一个基类的直接后裔类型?

如果是这样的继承层次我有,

class Base
{

}



class Derived1 : Base
{

}

class Derived1A : Derived1
{

}

class Derived1B : Derived1
{

}



class Derived2 : Base
{

}

我需要一种机制来发现所有的子类型的Base类中的一个特定的组件,其是在继承树的末端。 换一种说法,

SubTypesOf(typeof(Base)) 

应该给我

-> { Derived1A, Derived1B, Derived2 }

Answer 1:

这是我想出了。 不知道一些更优雅/有效的解决方案存在..

public static IEnumerable<Type> GetLastDescendants(this Type t)
{
    if (!t.IsClass)
        throw new Exception(t + " is not a class");

    var subTypes = t.Assembly.GetTypes().Where(x => x.IsSubclassOf(t)).ToArray();
    return subTypes.Where(x => subTypes.All(y => y.BaseType != x));
}

而对于完整起见,我将重新发布给定的直系后代的答案在这里

public static IEnumerable<Type> GetDirectDescendants(this Type t)
{
    if (!t.IsClass)
        throw new Exception(t + " is not a class");

    return t.Assembly.GetTypes().Where(x => x.BaseType == t);
}


文章来源: Get all last descendants of a base type?