Как вы получаете коллекцию всех типов, которые наследуются от определенного другого типа?Как найти все типы в сборке, которые наследуются от определенного типа C#
ответ
Что-то вроде:
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
.
Вы должны перечислить все типы и проверить каждый, если он наследует тот, который вы ищете.
Возможно, что-то похожее на код в this question.
Следующий метод получит набор типов, которые наследуют тип.
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
Если вам необходимо включить типы, которые реализуют интерфейс см ответ Скита @ Джон.
Рассмотрите возможность использования этого метода (написанный для 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();
}
- 1. Получение списка типов в сборке, которые наследуются от определенного интерфейса
- 2. Как получить все типы коллекции, которые наследуются от общего класса?
- 3. Как найти все типы зависимостей определенного типа на любой языковой сборке на основе CLR?
- 4. Как перечислить все типы, унаследованные от определенного типа в решении?
- 5. Почему типы значений наследуются от ссылочных типов?
- 6. IDEA (Java): как увидеть все классы, которые наследуются от этого
- 7. Список всех классов, которые наследуются от определенного класса/интерфейса
- 8. Найти типы, которые наследуют от данного INamedTypeSymbol
- 9. Все объекты наследуются от NSObject?
- 10. Jsoup: получение элементов, которые не наследуются от данного типа
- 11. Как распиливать классы, которые наследуются от TLorentzVector?
- 12. Как найти все классы определенного интерфейса в сборке в .net
- 13. Типы значений наследуются от System.Object ... почему?
- 14. Как получить все базовые типы в сборке?
- 15. Как получить все нижние типы в сборке?
- 16. Visual Studio: найти все ссылки определенного типа
- 17. Ловля исключений, которые не наследуются от Exception
- 18. Как я могу найти все пакеты, которые наследуются от пакета в Perl?
- 19. Найти поля члена определенного типа в C#
- 20. Модули тестирования модулей, которые наследуются от NSManagedObject
- 21. Как все классы наследуются от Object?
- 22. Как я могу найти все DbSets, общие типы которых получены из определенного базового типа?
- 23. Обновление классов, которые наследуются от абстрактных классов
- 24. Перечислить все типы в сборке внутри макроса
- 25. Поиск классов в DLL, которые наследуются от классов в недоступной сборке
- 26. C++ найти все файлы типа в папке?
- 27. Множество представлений, которые наследуются от шаблона
- 28. Наличие T-типа, как найти все классы, которые расширяют Base <T> в сборке?
- 29. Найти детей определенного типа
- 30. Настройка настраиваемого MongoDB BsonSerializer для всех классов, которые наследуются от базового типа
Спасибо! Я закончил с использованием этой Спасибо - Я закончил с использованием этой общественности статический список GetAllSubclassesOf (тип BaseType) { возврата Assembly.GetAssembly (BaseType) .GetTypes(). Где (type => type.IsSubclassOf (baseType)). ToList(); } –
aceinthehole
@Downvoter: Упомяните прокомментировать? –
@Downvoter здесь. Мой комментарий пропал. Как указано в обзоре, ответ неверен. Я добавил правильный ответ, поскольку я пропустил комментарий от туза, пока не нашел код, который не работал. Счастливого Рождества. –