这个问题是相反的如何查找是一个基类的直接后裔类型?
如果是这样的继承层次我有,
class Base
{
}
class Derived1 : Base
{
}
class Derived1A : Derived1
{
}
class Derived1B : Derived1
{
}
class Derived2 : Base
{
}
我需要一种机制来发现所有的子类型的Base
类中的一个特定的组件,其是在继承树的末端。 换一种说法,
SubTypesOf(typeof(Base))
应该给我
-> { Derived1A, Derived1B, Derived2 }
这是我想出了。 不知道一些更优雅/有效的解决方案存在..
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);
}