Pregunta ASP.NET Core Buscar todos los tipos de clase en todos los ensamblajes


Estoy tratando de hacer una aplicación central .NET basada en módulos, y necesito encontrar todas las clases de un tipo (s) específico (s) en todos los ensamblajes. Como cada módulo se construirá en su propio proyecto.

¿Pero no puedo ver / encontrar cómo hacer eso en ASP.NET Core? Cualquier indicador sería apreciada.


5
2018-03-01 06:27


origen


Respuestas:


Para cargar todas las clases de un ensamblaje, consulte el siguiente código. En mi caso IProfile es la interfaz que necesito buscar

var all = Assembly
        .GetEntryAssembly()
        .GetReferencedAssemblies()
        .Select(Assembly.Load)
        .SelectMany(x => x.DefinedTypes)
        .Where(type => typeof(IProfile).GetTypeInfo().IsAssignableFrom(type.AsType()));    

foreach (var ti in all)
{
   var t = ti.AsType();
   if (t.Equals(typeof(IProfile)))
   {

   }
}

Hola leen3oEn caso de que tenga ensamblados externos o complementos, puede obtener todos los tipos iterando desde la lista de ensamblajes. En el siguiente código, "GlobalConfiguration.Modules" contiene mi lista de complementos

List<Type> typeToRegisters = new List<Type>();  
    foreach (var module in GlobalConfiguration.Modules)
    {
    typeToRegisters.AddRange(module.Assembly.DefinedTypes.Select(t => t.AsType()));
          }     

    var entity-types = typeToRegisters.Where(x =>  x.GetTypeInfo().IsSubclassOf(typeof(IBaseDomainEntity)) &&  !x.GetTypeInfo().IsAbstract);

aquí "IBaseDomainEntity" es mi interfaz que estoy buscando. Lo único que me preocupa aquí es la eficiencia que no he comprobado


6
2017-07-25 01:05



Probablemente encontré una forma de lograr esto,

var all =
        Assembly
        .GetEntryAssembly()
        .GetReferencedAssemblies()
        .Select(Assembly.Load)
        .SelectMany(x => x.DefinedTypes)
        .Where(type => typeof(ICloudProvider).IsAssignableFrom(type.AsType()));
foreach (var ti in all)
{
    var t = ti.AsType();
    if (!t.Equals(typeof(ICloudProvider)))
    {
        // do work
    }
}

Estoy preocupado por el costo de la Assembly.Load parte, pero esto probablemente hará mi trabajo por ahora, ya que solo necesito el nombre completo de todas las clases que implemente ICloudProvider.


4
2018-06-08 19:42



Creo que debería obtener una colección de todos los ensamblajes que desea buscar, de lo que puede recorrer los ensamblajes para encontrar una posible coincidencia de tipo.

El siguiente código le muestra cómo obtener un tipo asignable. También puede agregar cheques para excluir clases abstractas o verificar si un tipo implementa un tipo genérico.

foreach (var assembly in _assemblies)
{
    foreach (var candidate in assembly.ExportedTypes.Select(t => t.GetTypeInfo()))
    {
        if (assignTypeFrom.GetTypeInfo().IsAssignableFrom(candidate) && candidate.IsClass)
        {
            yield return candidate.AsType();
        }
    }
}

1
2018-03-01 07:52