Jak mogę uzyskać wszystkie klasy w przestrzeni nazw?

Odpowiedzi:

142

Będziesz musiał to zrobić „wstecz”; wypisz wszystkie typy w zestawie, a następnie sprawdź przestrzeń nazw każdego typu:

using System.Reflection;
private Type[] GetTypesInNamespace(Assembly assembly, string nameSpace)
{
    return 
      assembly.GetTypes()
              .Where(t => String.Equals(t.Namespace, nameSpace, StringComparison.Ordinal))
              .ToArray();
}

Przykład użycia:

Type[] typelist = GetTypesInNamespace(Assembly.GetExecutingAssembly(), "MyNamespace");
for (int i = 0; i < typelist.Length; i++)
{
    Console.WriteLine(typelist[i].Name);
}

W przypadku czegokolwiek wcześniejszego niż .Net 2.0, gdzie Assembly.GetExecutingAssembly()nie jest dostępny, będziesz potrzebować małego obejścia, aby uzyskać zestaw:

Assembly myAssembly = typeof(<Namespace>.<someClass>).GetTypeInfo().Assembly;
Type[] typelist = GetTypesInNamespace(myAssembly, "<Namespace>");
for (int i = 0; i < typelist.Length; i++)
{
    Console.WriteLine(typelist[i].Name);
}
Fredrik Mörk
źródło
2
.Where (t => String.Equals (t.Namespace, nameSpace, StringComparison.Ordinal)
abatishchev
8
Pamiętaj też, że Assembly! = Namespace - niektóre przestrzenie nazw są rozmieszczone w wielu zestawach.
Bevan
1
i dlaczego nie zwrócić tylko IEnumerable <Type>? Tym bardziej, że wyliczasz wyniki, także „foreach” zamiast „for”, jak sądzę, jest lepsze.
abatishchev
2
Dobre komentarze, dzięki za to. Wykonanie zwracanego typu do IEnumerable <Type> eliminuje potrzebę ostatniego wywołania ToArray. Nie jestem pewien, czy zgadzam się, że „foreach” jest lepsze niż „for”; jak ja to widzę, różnica w wydajności jest pomijalna, więc myślę, że sprowadza się to do osobistego stylu. Ale może mieć dobry argument za preferowaniem „foreach”; jeśli tak, podziel się nim; Lubię, gdy się mylę :)
Fredrik Mörk
3
Myślę, że każdy jest po prostu łatwiejszy do osobistego spojrzenia. Za kulisami obie pętle są prawie takie same, jeśli chodzi o wydajność.
Chev
5

Musisz podać trochę więcej informacji ...

Czy masz na myśli użycie Reflection. Możesz iterować przez Manifest zestawów i uzyskać listę typów przy użyciu

   System.Reflection.Assembly myAssembly = Assembly.LoadFile("");

   myAssembly.ManifestModule.FindTypes()

Jeśli jest tylko w Visual Studio, możesz po prostu pobrać listę w oknie Intellisense lub otwierając przeglądarkę obiektów (CTRL + W, J)

Eoin Campbell
źródło
0

Dzięki Reflection możesz przeglądać wszystkie typy w złożeniu. Typ ma właściwość Namespace, której używasz do filtrowania tylko interesującej Cię przestrzeni nazw.

Gerrie Schenck
źródło