2010-09-09 9 views
6

Sono un po 'nuovo per la riflessione in C#. Sto provando a generare una lista di tutti i controller per verificare se sono decorati o meno con un actionfilt specifico. Durante la scrittura dei test delle unità, come si accede all'assieme testato?Rifletti sull'elenco dei controller

Questo non sembra funzionare:

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

risposta

4

Se si conosce un tipo nella vostra assemblea principale, è possibile utilizzare:

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; 
    } 

Sostituire MyType con il tipo noto.

utilizzo questa in una classe base con this.GetType() anziché typeof(MyType), in modo che possa riferimento al montaggio per i quali tipo derrived è definita.

+0

Grazie John. Una domanda: il "dove typeof (Controller) .IsAssignableFrom (t)" è sufficiente per confermare che si tratta di un tipo di controller? Sono un po 'nuovo anche a Linq, tra l'altro :) – morganpdx

+0

Sì, dovrebbe essere sufficiente. Ho appena guardato il codice sorgente di MVC, e sembra che non gli importi se sia "EndWith (" Controller ")" in modo che tu possa prendere quella parte. –

0

Si conoscerà il nome dell'assieme al momento in cui si scrivono i test. L'utilizzo di Assembly.ReflectionOnlyLoad() è una scelta appropriata per questo scenario.

In alternativa, è possibile disegnare dalla proprietà Assembly di un singolo tipo noto dall'assieme.

0

Assembly.GetAssemblyByName() è probabilmente il biglietto per cercare un'assemblea diversa dalla tua. Verrà visualizzato nei collegamenti all'assieme dell'applicazione, quindi nella directory dell'applicazione corrente, quindi nel GAC. È anche possibile ottenere la classe Assembly assegnata a un'istanza di oggetto oa un tipo di riferimento statico chiamando GetType().Assembly.

Da questa classe di assiemi, è possibile scorrere i tipi in esso contenuti come oggetti Tipo utilizzando GetExportedTypes(). Questo restituirà solo tipi pubblici; quelli a cui si poteva accedere se si faceva riferimento all'assembly in modo statico. Puoi filtrarli con qualsiasi cosa tu possa analizzare in modo riflessivo; nome, tipi di genitori, nomi dei membri, attributi che decorano la classe o qualsiasi membro, ecc.

Problemi correlati