hay dos pasos de conseguirlo:
- El
AppDomain.CurrentDomain.GetAssemblies()
le da todos los ensamblados cargados en el dominio de aplicación actual.
- La clase
Assembly
proporciona un método GetTypes()
para recuperar todos los tipos dentro de ese ensamblaje en particular.
De ahí su código podría tener este aspecto:
foreach (Assembly a in AppDomain.CurrentDomain.GetAssemblies())
{
foreach (Type t in a.GetTypes())
{
// ... do something with 't' ...
}
}
Para buscar tipos específicos (por ejemplo, la implementación de una interfaz dada, heredando de un ancestro común o lo que sea) que tendrá que filtrar la salida resultados. En caso de que necesites hacer eso en varios lugares de tu aplicación, es una buena idea construir una clase de ayuda con diferentes opciones. Por ejemplo, comúnmente he aplicado filtros de prefijo de espacio de nombre, filtros de implementación de interfaz y filtros de herencia.
Para obtener documentación detallada eche un vistazo a MSDN here y here.
Por supuesto, si vas a hacer algunos filtros en esos tipos y ensamblajes, usarás LINQ, ¿verdad? ;) –
@Niall Connaughton Esa es una cuestión de preferencia personal. –
He encontrado situaciones en las que hacer esto provoca una excepción, resultó ser porque mi aplicación estaba generando ensamblajes dinámicos, solo tengo que tener en cuenta. Puede identificar los conjuntos dinámicos y omitirlos así http://stackoverflow.com/questions/1423733/how-to-tell-if-a-net-assembly-is-dynamic - si causa un problema –