C #: Wyświetl wszystkie klasy w zestawie

103

Chciałbym wyprowadzić (programowo - C #) listę wszystkich klas w moim zestawie.

Wszelkie wskazówki lub przykładowy kod, jak to zrobić? Odbicie?

Alex
źródło
Jeśli zamierzasz zbadać zespół, do którego Twój projekt nie odwołuje się, zobacz moją zaktualizowaną odpowiedź.
Thorarin

Odpowiedzi:

152

Użyj Assembly.GetTypes. Na przykład:

Assembly mscorlib = typeof(string).Assembly;
foreach (Type type in mscorlib.GetTypes())
{
    Console.WriteLine(type.FullName);
}
Jon Skeet
źródło
1
Jakieś sugestie dotyczące dużych złożeń? Kiedy uruchamiam ten kod dla zestawu 13,8 MB, moja instancja VS zawiesza się na czas nieokreślony. Wypróbowałem mały zespół 9 KB i działał dobrze. Wiem, o czym myślisz - dlaczego masz zestaw 13,8 MB - jest to część mojej warstwy danych wygenerowana przy użyciu szablonu NetTeirs. Mamy wiele stołów.
dyslexicanaboko
1
@dyslexicanaboko: Cóż, jeśli masz wiele typów, wyliczenie ich wszystkich zajmie dużo czasu. Ile typów jest w Twoim zespole? A co z nimi robisz? (Czy na pewno problem tkwi w wyodrębnianiu typów, czy po prostu w tym, co robisz później?)
Jon Skeet
Nie mogę ominąć wywołania asm.GetTypes (), po prostu zawiesza się - mam na myśli to, że jest to oczywiście fakt, że istnieje wiele typów - nie mogę nic zrobić, ponieważ jest to wiercenie w celu uzyskania ich wszystkich . Mój procesor strzela do 30% na jednym z moich 4 rdzeni. To znaczy naprawdę zastanawiam się, czy jest sposób, aby powiedzieć „Hej - patrz tylko w TEJ przestrzeni nazw” - mam wrażenie, że nie jest to możliwe, ponieważ metoda GetTypes () ma tylko pusty konstruktor. Próbuję zrobić przeglądarkę obiektów.
dyslexicanaboko
1
Słuszna uwaga, jeszcze tego nie próbowałem. Moim obejściem na razie jest po prostu kierowanie na klasy bezpośrednio przy użyciu asm.GetType (w pełniQualifiedClassName) - to działa, ale pokazanie listy klas użytkownikowi nie jest możliwe, a właśnie tego chciałem. Tak przy okazji, to nie jest klient, używam go wewnętrznie dla siebie i innych programistów.
dyslexicanaboko
1
@DebugErr: Tak - jeśli chcesz, łatwo jest zrobić tylko zajęcia, ale przypuszczam, że OP prawdopodobnie naprawdę chciał wszystkich typów.
Jon Skeet
102

Chciałbym tylko dodać do przykładu Jona. Aby uzyskać odniesienie do własnego zespołu, możesz użyć:

Assembly myAssembly = Assembly.GetExecutingAssembly();

System.Reflection przestrzeń nazw.

Jeśli chcesz zbadać zestaw, do którego nie masz odniesienia, możesz użyć jednego z następujących:

Assembly assembly = Assembly.ReflectionOnlyLoad(fullAssemblyName);
Assembly assembly = Assembly.ReflectionOnlyLoadFrom(fileName);

Jeśli zamierzasz utworzyć instancję swojego typu po jego znalezieniu:

Assembly assembly = Assembly.Load(fullAssemblyName);
Assembly assembly = Assembly.LoadFrom(fileName);

Zobacz dokumentację klasy Assembly, aby uzyskać więcej informacji.

Gdy już masz odniesienie do Assemblyobiektu, możesz użyć tego , co assembly.GetTypes()już zademonstrował Jon.

Thorarin
źródło
Jak mogę odwołać się do zupełnie innego zestawu, który jest w moim rozwiązaniu?
Alex
13
Najłatwiej jest użyć typeofz typem, który znasz, znajduje się w tym zestawie, a następnie Assemblywłaściwość, jak w moim przykładzie.
Jon Skeet
2
Jeśli chcesz odwołać się do zestawu, powiedz abc.dll, czyli w rozwiązaniu, i jeśli możesz zakodować na stałe nazwę biblioteki dll, innym podejściem do odwoływania się do zestawu jest: `Assembly assembly = Assembly.Load (" abc ");`
Kash
Ładuje tylko bieżący zestaw. Mam aplikację lub exe korzystającą z 4 bibliotek dll lub projektów. Jak mogę uzyskać nazwy klas tych bibliotek DLL?
Er Mayank
@JonSkeet Jak byłoby to osiągalne w „nowoczesnym” środowisku C #? Na przykład podczas tworzenia oprogramowania UWP. Platforma UWP nie ma metody GetExecutingAssembly ().
Daniel Armstrong