2010-09-09 5 views
6

Ich bin ein wenig zu Reflexion in C#. Ich versuche, eine Liste aller Controller zu erstellen, um zu testen, ob sie mit einem bestimmten Actionfilter versehen sind oder nicht. Wie greifen Sie beim Schreiben von Komponententests auf die getestete Baugruppe zu?Reflektieren über die Liste der Controller

Dies scheint nicht zu funktionieren:

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

Antwort

4

Wenn Sie einen Typ in Ihrem Hauptbaugruppe kennen, können Sie verwenden:

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

ersetzen MyType mit der bekannten Art.

Ich verwende diese in einer Basisklasse mit this.GetType() anstelle von typeof(MyType), so dass ich die Anordnung verweisen können, in dem die schließt man Typ definiert ist.

+0

Dank John. Eine Frage: Ist nicht "where type (Controller) .IsAssignableFrom (t)" ausreichend, um zu bestätigen, dass es sich um einen Controller-Typ handelt? Ich bin auch etwas zu Linq, btw :) – morganpdx

+0

Ja, das sollte ausreichen. Ich habe mir nur den Quellcode von MVC angeschaut, und es sieht so aus, als ob es ihnen egal ist, wenn es 'EndWith (" Controller ") ist, also könntest du diesen Teil herausnehmen. –

0

Sie kennen den Namen der Baugruppe zu dem Zeitpunkt, zu dem Sie Ihre Tests schreiben. Die Verwendung von Assembly.ReflectionOnlyLoad() ist eine geeignete Wahl für dieses Szenario.

Alternativ können Sie von der Assembly Eigenschaft eines beliebigen einzelnen bekannten Typs aus der Baugruppe zeichnen.

0

Assembly.GetAssemblyByName() ist wahrscheinlich das Ticket für eine andere Montage als Ihre suchen. Es wird in den Assembly-Bindungen Ihrer Anwendung, dann im aktuellen Anwendungsverzeichnis und dann im GAC gesucht. Sie können die Assembly-Klasse auch mit einer Objektinstanz oder einem statisch referenzierten Typ abrufen, indem Sie GetType().Assembly aufrufen.

Von dieser Assembly-Klasse können Sie die darin enthaltenen Typen als Type-Objekte mit GetExportedTypes() durchlaufen. Dies gibt nur öffentliche Typen zurück. auf die Sie zugreifen könnten, wenn Sie die Assembly statisch referenziert hätten. Sie können diese nach allem filtern, was Sie reflektiv analysieren können. Name, Elternarten, Mitgliedsnamen, Attribute, die die Klasse oder irgendein Mitglied dekorieren usw.

Verwandte Themen