Algo como:
public IEnumerable<Type> FindDerivedTypes(Assembly assembly, Type baseType)
{
return assembly.GetTypes().Where(t => baseType.IsAssignableFrom(t));
}
Se você precisa lidar com genéricos, fica um pouco mais complicado (por exemplo, passar o List<>
tipo aberto, mas esperando receber de volta um tipo derivado de List<int>
). Caso contrário, é simples :)
Se você deseja excluir o próprio tipo, pode fazer isso com bastante facilidade:
public IEnumerable<Type> FindDerivedTypes(Assembly assembly, Type baseType)
{
return assembly.GetTypes().Where(t => t != baseType &&
baseType.IsAssignableFrom(t));
}
Observe que isso também permitirá que você especifique uma interface e encontre todos os tipos que a implementam, em vez de apenas trabalhar com classes como Type.IsSubclassOf
faz.
IsAssignableFrom
deve funcionar também. Em particular, minha versão lida com interfaces também. Você testou meu código? Em que caso minha resposta falha?O método a seguir obterá uma coleção de tipos que herdam um tipo.
C #
VB.NET
Se você precisa incluir tipos que implementam uma interface, veja a resposta de @Jon Skeet.
fonte
Você tem que enumerar todos os tipos e verificar se cada um herda o que você está procurando.
Algum código como o desta questão pode ser útil para você.
fonte
Considere usar este método (escrito para um PCL):
fonte