Как узнать, есть ли у класса наследник? (C#)

Пишу курсовую работу с использованием БД. Есть многоуровневая иерархия классов радиодеталей, однако в таблицы БД я записываю только конечные типы (например, Detail --> Diode --> LightDiode (в качестве таблицы в БД используется только LightDiode)). Так вот, вопрос в том, как при получении имён классов-наследников класса Detail пропускать промежуточные классы (те, у которых есть ещё наследники). Есть ли какая-то команда для этого, или, может, стоит использовать рекурсию? Код, представленный ниже, подтягивает всех наследников, включая ненужные промежуточные типы:

public static List<string> GetTypes()
    {
        List<string> types = new List<string>();
        Type detail = typeof(Detail);
        IEnumerable<Type> childs = Assembly.GetAssembly(detail).GetTypes().Where(type => type.IsSubclassOf(detail));
        foreach (Type type in childs)
        {
           types.Add(type.Name);
        }
        return types;
    }

введите сюда описание изображения

(Синим помечены промежуточные классы (те, у которых есть наследники))

Спасибо!


Ответы (1 шт):

Автор решения: iKuzmychov

Я не совсем понимаю, что вы хотите сделать, однако могу дать ответ на вопрос: "Как исключить из списка типов те типы, которые напрямую унаследованы не от object?".

Вы можете получить список всех типов в нужной сборке и затем проверить: является ли нужных тип производным от одного из типов сборки.

Код:

var typesToCheck  = new List<Type>() { ... }; // список типов, которые нужно проверить
var assembly      = Assembly.GetExecutingAssembly(); // получение текущеё сборки
var assemblyTypes = assembly.GetTypes(); // список типов, определённых в сборке

// список проверенных типов
var typesWitoutInheritor = typesToCheck
    .Where(typeToCheck => assemblyTypes
        .All(!assemblyType.IsSubclassOf(typeToCheck)))
    .ToList();
→ Ссылка