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?


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

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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.