Ответ 1
Во-первых, я бы использовал Type.IsAssignableFrom
, а не GetInterfaces
, но тогда все, что вам нужно сделать, это исключить типы, родительский тип которых уже находится в наборе:
var allClasses = types.Where(type => typeof(IFace).IsAssignableFrom(type))
.ToList(); // Or use a HashSet, for better Contains perf.
var firstImplementations = allClasses
.Except(allClasses.Where(t => allClasses.Contains(t.BaseType)));
Или, как отмечено в комментариях, эквивалентно:
var firstImplementations = allClasses.Where(t => !allClasses.Contains(t.BaseType));
Обратите внимание, что это не возвращает класс, который выводится из класса, который реализует интерфейс, но восстанавливает его.