2013-06-04 2 views
0

я могу найти все классы, подклассы BaseClass с чем-то вродеУчитывая базовый класс, как мне найти наиболее специализированные подклассы?

var subclasses = Assembly 
    .GetAssembly(typeof(BaseClass)) 
    .GetTypes() 
    .Where(t => t.IsSubclassOf(typeof(BaseClass))) 

Теперь, как я могу выбрать только самые специализированные подклассы? То есть, листовые узлы, те, у которых нет подклассов.

+0

Нет. Пока нет. – shamp00

ответ

1
subclasses.Where(c => !subclasses.Any(c2 => c == c2.BaseType)) 

Это будет быстрее, если вы создали HashSet BaseTypes.

Это работает только потому, что BaseClass находится в той же сборке; в противном случае он некорректно улавливал бы промежуточные классы, которые наследуются от промежуточного класса в другой сборке.
Более общим решением было бы проверить IsAssignableFrom на любой другой подкласс.

+1

Обратите внимание, что из-за отложенного выполнения для каждого типа вы повторяете все типы сборки и фильтруете те, которые являются подклассами базового типа. Это делает очень важным вставить «подклассы» в коллекцию в первую очередь. Как вы сказали, «HashSet» будет предпочтительным вариантом. – Servy

+0

@Servy: Очень хорошая точка. Если вы не хотите использовать HashSet, используйте '.ToList()' и 'RemoveAll()'. – SLaks

+0

Это возвращает первый уровень подклассов. Если C1 и C2 являются подклассами B, которые являются подклассами A, мне нужны C1 и C2. Ваш ответ возвращается B. – shamp00

Смежные вопросы