2010-09-09 4 views
6

Je suis un peu nouveau pour la réflexion en C#. J'essaie de générer une liste de tous les contrôleurs afin de tester s'ils sont décorés avec un filtre d'action spécifique. Lors de l'écriture de tests unitaires, comment accéder à l'ensemble testé?Réfléchir sur la liste des contrôleurs

Cela ne semble pas fonctionner:

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

Répondre

4

Si vous connaissez un type dans votre assemblage principal, vous pouvez utiliser:

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

Remplacer MyType avec le type connu.

I utiliser dans une classe de base avec this.GetType() au lieu de typeof(MyType), de sorte que je peux référencer l'ensemble dans lequel est défini type derrived.

+0

Merci John. Une question: le "where typeof (Controller) .IsAssignableFrom (t)" n'est-il pas suffisant pour confirmer qu'il s'agit d'un type de contrôleur? Je suis un peu nouveau à Linq aussi, btw :) – morganpdx

+0

Oui, cela devrait être suffisant. Je viens de regarder le code source de MVC, et il semble qu'ils ne se soucient pas de savoir si EndWith ("Controller") 'de sorte que vous pourriez prendre cette partie. –

0

Vous connaîtrez le nom de l'assemblage au moment où vous écrivez vos tests. L'utilisation de Assembly.ReflectionOnlyLoad() est un choix approprié pour ce scénario. Comme alternative, vous pouvez tirer de la propriété Assembly de n'importe quel type unique connu de l'assemblage.

0

Assembly.GetAssemblyByName() est probablement le ticket pour chercher un assemblage autre que le vôtre. Il apparaîtra dans les liaisons d'assemblage de votre application, puis dans le répertoire de l'application en cours, puis dans le GAC. Vous pouvez également obtenir la classe Assembly avec une instance d'objet ou un type référencé statiquement en appelant GetType().Assembly. À partir de cette classe Assembly, vous pouvez parcourir les types contenus en tant qu'objets Type à l'aide de GetExportedTypes(). Cela retournera les types publics seulement; ceux auxquels vous pouvez accéder si vous avez référencé l'ensemble de manière statique. Vous pouvez les filtrer par tout ce que vous pouvez analyser de manière réfléchie. nom, types de parent, noms de membre, attributs décorant la classe ou tout membre, etc.

Questions connexes