2013-08-28 4 views
1

Этого вопросом является противоположностью How to find types that are direct descendants of a base class?Получите все последние потомки базового типа?

Если это иерархия наследования у меня есть,

class Base 
{ 

} 



class Derived1 : Base 
{ 

} 

class Derived1A : Derived1 
{ 

} 

class Derived1B : Derived1 
{ 

} 



class Derived2 : Base 
{ 

} 

Мне нужен механизм, чтобы найти все типы вложенного Base класса в конкретной сборке, которые на конец дерева наследования. Другими словами,

SubTypesOf(typeof(Base)) 

должен дать мне

-> { Derived1A, Derived1B, Derived2 } 

ответ

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)); 
} 

И для полноты картины, я буду перепечатывать ответ на прямые потомки дал here

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); 
} 
+0

насчет Derived1? – I4V

+0

@ I4V Derived1 не находится в конце дерева иерархии. У него есть дети. У меня было специальное требование сегодня, когда я хотел самой молодой партии :) – nawfal