2010-09-09 8 views
6

Soy un poco nuevo para la reflexión en C#. Intento generar una lista de todos los controladores para probar si están decorados con un filtro de acción específico o no. Al escribir pruebas unitarias, ¿cómo accedes al ensamblaje probado?Reflejar la lista de controladores

no parece que esto funcione:

var myAssembly = System.Reflection.Assembly.GetExecutingAssembly(); 

Respuesta

4

Si conoces a un tipo en su conjunto principal, que puede utilizar:

private IEnumerable<Type> GetControllers() 
    { 
     return from t in typeof(MyType).Assembly.GetTypes() 
       where t.IsAbstract == false 
       where typeof(Controller).IsAssignableFrom(t) 
       where t.Name.EndsWith("Controller", StringComparison.OrdinalIgnoreCase) 
       select t; 
    } 

Reemplazar MyType con el tipo conocido.

I utilizar esto en una clase base con this.GetType() en lugar de typeof(MyType), de modo que pueda hacer referencia al ensamblado en el que el tipo derrived se define.

+0

Gracias John. Una pregunta: ¿no es el "where typeof (Controller) .IsAssignableFrom (t)" suficiente para confirmar que es un tipo de controlador? También soy un poco nuevo para Linq, por cierto :) – morganpdx

+0

Sí, eso debería ser suficiente. Acabo de ver el código fuente de MVC, y parece que no les importa si 'EndWith (" Controller ")' por lo que puede quitar esa parte. –

0

Sabrá el nombre del ensamblaje en el momento en que escribe sus pruebas. Usar Assembly.ReflectionOnlyLoad() es una opción adecuada para este escenario.

Como alternativa, puede extraer de la unidad la propiedad Assembly de cualquier tipo conocido.

0

Assembly.GetAssemblyByName() es probablemente el ticket para buscar un ensamblaje que no sea el suyo. Se verá en los enlaces de ensamblaje de su aplicación, luego en el directorio de la aplicación actual y luego en el GAC. También puede obtener la clase Assembly dada una instancia de objeto o un tipo referenciado estáticamente llamando al GetType().Assembly.

Desde esta clase de ensamblaje, puede recorrer los tipos que contiene como Type objects usando GetExportedTypes(). Esto devolverá los tipos públicos solamente; a los que podría acceder si hizo referencia al conjunto estáticamente. Puede filtrar estos por cualquier cosa que pueda analizar reflexivamente; nombre, tipos de padres, nombres de miembros, atributos que decoran la clase o cualquier miembro, etc.

Cuestiones relacionadas