воскресенье, 23 января 2011 г.

Reflection получение всех типов которые наследуют от базового типа


Чтобы получить все классы, из какой либо сборки, которые наследуют от данного класса можно воспользоваться методом IsSubclassOf(Type baseType)
Например, вот так:

public IEnumerable<Type> GetAllDerivedTypesOf(Type baseType)
{
    var types = Assembly.GetAssembly(baseType).GetTypes();
    return types.Where(t => t.IsSubclassOf(baseType));
}

Данный метод ищет все типы в сборке, где находится базовый класс
Метод IsSubclassOf() работает только с классами если передать в качестве параметра тип интерфейс, то метод вернет false и соответственно ничего не будет найдено.

Для того чтобы найти все типы которые наследуют от какого либо класса либо реализуют определенный интерфейс нужно воспользоваться методом
IsAssignableFrom(Type type) данный метод проверяет, если параметр является наследником текущего класса или же если текущий тип является интерфейсом, то метод проверяет, если тип параметра реализует интерфейс, также данный метод возвращает true если параметр type равен текущему типу.
Следующий метод вернет все типы, которые наследуются от baseType даже если передать в качестве параметра интерфейс

public IEnumerable<Type> GetAllDerivedTypesOf (Type baseType)
{
    var types = Assembly.GetAssembly(baseType).GetTypes();

    return types.Where(baseType.IsAssignableFrom).Where(t => t != baseType);
}