2009-08-12 2 views

ответ

127

Что-то вроде:

public IEnumerable<Type> FindDerivedTypes(Assembly assembly, Type baseType) 
{ 
    return assembly.GetTypes().Where(t => baseType.IsAssignableFrom(t)); 
} 

Если вам нужно работать с дженериков, который получает несколько сложнее (например, переходящие в открытом List<> типа, но рассчитывая получить обратно тип, который производный от List<int>). В противном случае это просто, хотя :)

Если вы хотите исключить сам тип, вы можете сделать это достаточно легко:

public IEnumerable<Type> FindDerivedTypes(Assembly assembly, Type baseType) 
{ 
    return assembly.GetTypes().Where(t => t != baseType && 
              baseType.IsAssignableFrom(t)); 
} 

Обратите внимание, что это также позволит вам указать интерфейс и найти все типы, которые реализовать его, а не просто работать с классами, как Type.IsSubclassOf.

+2

Спасибо! Я закончил с использованием этой Спасибо - Я закончил с использованием этой общественности статический список GetAllSubclassesOf (тип BaseType) { возврата Assembly.GetAssembly (BaseType) .GetTypes(). Где (type => type.IsSubclassOf (baseType)). ToList(); } – aceinthehole

+0

@Downvoter: Упомяните прокомментировать? –

+0

@Downvoter здесь. Мой комментарий пропал. Как указано в обзоре, ответ неверен. Я добавил правильный ответ, поскольку я пропустил комментарий от туза, пока не нашел код, который не работал. Счастливого Рождества. –

1

Вы должны перечислить все типы и проверить каждый, если он наследует тот, который вы ищете.

Возможно, что-то похожее на код в this question.

22

Следующий метод получит набор типов, которые наследуют тип.

C#

public IEnumerable<Type> FindSubClassesOf<TBaseType>() 
{ 
    var baseType = typeof(TBaseType); 
    var assembly = baseType.Assembly; 

    return assembly.GetTypes().Where(t => t.IsSubclassOf(baseType)); 
} 

VB.NET

Public Function FindSubClasses(Of TBaseType)() As IEnumerable(Of Type) 

    Dim baseType = GetType(TBaseType) 
    Dim assembly = baseType.Assembly 

    Return From t In assembly.GetTypes() 
      Where t.IsSubClassOf(baseType) 
      Select t 

End Function 

Если вам необходимо включить типы, которые реализуют интерфейс см ответ Скита @ Джон.

0

Рассмотрите возможность использования этого метода (написанный для PCL):

public IEnumerable<Type> FindDerivedTypes(Assembly assembly, Type baseType) 
{ 
     TypeInfo baseTypeInfo = baseType.GetTypeInfo(); 
     bool isClass = baseTypeInfo.IsClass, isInterface = baseTypeInfo.IsInterface; 

     return 
      from type in assembly.DefinedTypes 
      where isClass ? type.IsSubclassOf(baseType) : 
        isInterface ? type.ImplementedInterfaces.Contains(baseTypeInfo.AsType()) : false 
      select type.AsType(); 
} 
Смежные вопросы