This is what I have come up with. Not sure if some more elegant/efficient solutions exist..
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));
}
And for sake of completeness, I will repost the answer for direct descendants given 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);
}