Istnieją dwa kroki do osiągnięcia tego celu:
AppDomain.CurrentDomain.GetAssemblies()
zapewnia wszystkie zespoły załadowane w bieżącej domenie aplikacji.
- Klasa
Assembly
zapewnia metodę GetTypes()
do pobierania wszystkich typów z tego konkretnego zespołu.
Stąd kod może wyglądać następująco:
foreach (Assembly a in AppDomain.CurrentDomain.GetAssemblies())
{
foreach (Type t in a.GetTypes())
{
// ... do something with 't' ...
}
}
Aby wyszukać określonych typów (np realizacji danego interfejsu, dziedziczy od wspólnego przodka lub cokolwiek) będziesz musiał się z filtrem wyniki. Jeśli potrzebujesz tego w wielu miejscach w swojej aplikacji, dobrym pomysłem jest zbudowanie klasy pomocniczej zapewniającej różne opcje. Na przykład często stosowałem filtry prefiksów przestrzeni nazw, filtry implementacji interfejsów i filtry dziedziczenia.
Aby uzyskać szczegółową dokumentację, zapoznaj się z artykułami MSDN here i here.
Oczywiście, jeśli zamierzałeś zrobić filtrowanie na tych typach i złożeniach, używałbyś LINQ, prawda? ;) –
@Niall Connaughton To kwestia osobistych preferencji. –
Znalazłem sytuacje, gdy robiąc to powoduje wyjątek, okazało się, ponieważ moja aplikacja generuje dynamiczne złożeń, tylko gotcha, aby być świadomym. Możesz zidentyfikować zespoły dynamiczne i pominąć je tak, jak ten http://stackoverflow.com/questions/1423733/how-to-tell-if-a-net-assembly-is-dynamic - jeśli to powoduje problem –