Wie kann ich alle Klassen in einem Namespace abrufen?

Antworten:

142

Sie müssen es "rückwärts" machen; Listen Sie alle Typen in einer Assembly auf und überprüfen Sie dann den Namespace jedes Typs:

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

Anwendungsbeispiel:

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

Für alles, was vor .Net 2.0 Assembly.GetExecutingAssembly()nicht verfügbar ist, benötigen Sie eine kleine Problemumgehung, um die Assembly zu erhalten:

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
quelle
2
.Where (t => String.Equals (t.Namespace, nameSpace, StringComparison.Ordinal)
abatishchev
8
Beachten Sie außerdem, dass Assembly! = Namespace - einige Namespaces sind auf mehrere Assemblys verteilt.
Bevan
1
und warum nicht nur einen IEnumerable <Type> zurückgeben? Umso mehr führen Sie eine Aufzählung zwischen den Ergebnissen durch, auch 'foreach' anstelle von 'for' ist besser, denke ich.
Abatishchev
2
Gute Kommentare, danke dafür. Wenn Sie den Rückgabetyp auf einen IEnumerable <Typ> setzen, ist der letzte ToArray-Aufruf nicht mehr erforderlich. Ich bin mir nicht sicher, ob ich damit einverstanden bin, dass "foreach" besser ist als "for". Aus meiner Sicht ist der Leistungsunterschied vernachlässigbar, daher denke ich, dass es auf den persönlichen Stil ankommt. Kann aber ein gutes Argument dafür haben, "foreach" zu bevorzugen; Wenn ja, können Sie es gerne teilen. Ich möchte gerne als falsch erwiesen werden :)
Fredrik Mörk
3
Ich denke, foreach ist einfach einfacher persönlich zu betrachten. Hinter den Kulissen sind die beiden Loops in Bezug auf die Leistung ziemlich gleich.
Chev
5

Sie müssen ein wenig mehr Informationen bereitstellen ...

Meinen Sie mit Reflection. Sie können ein Assembly-Manifest durchlaufen und mithilfe eine Liste der Typen abrufen

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

   myAssembly.ManifestModule.FindTypes()

Wenn es sich nur um Visual Studio handelt, können Sie die Liste einfach im Intellisense-Fenster oder durch Öffnen des Objektbrowsers (STRG + W, J) abrufen.

Eoin Campbell
quelle
0

Mit Reflection durchlaufen Sie alle Typen in einer Baugruppe. Ein Typ verfügt über eine Namespace-Eigenschaft, mit der Sie nur den Namespace filtern, an dem Sie interessiert sind.

Gerrie Schenck
quelle