名前空間内のすべてのクラスを取得するにはどうすればよいですか?


回答:


142

あなたはそれを「後方に」行う必要があるでしょう。アセンブリ内のすべてのタイプを一覧表示してから、各タイプの名前空間を確認します。

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

使用例:

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

.Net 2.0より前のバージョンAssembly.GetExecutingAssembly()が利用できない場合は、アセンブリを取得するための小さな回避策が必要になります。

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

2
.Where(t => String.Equals(t.Namespace、nameSpace、StringComparison.Ordinal)
abatishchev 2009年

8
また、Assembly!=名前空間-一部の名前空間は複数のアセンブリに分散していることに注意してください。
Bevan

1
そして、なぜIEnumerable <Type>だけを返さないのですか?さらに、結果間で列挙を行います。また、「for」ではなく「foreach」の方が優れていると思います。
abatishchev 2009年

2
良いコメント、ありがとう。戻り値の型をIEnumerable <Type>にすることで、最後のToArray呼び出しが不要になります。ただし、「foreach」が「for」よりも優れていることに同意するかどうかはわかりません。私が見ているように、パフォーマンスの違いはごくわずかなので、個人的なスタイルに帰着すると思います。しかし、「foreach」を優先するための良い議論があるかもしれません。もしそうなら、それを自由に共有してください。私は間違っていると証明されるのが好きです:)
FredrikMörk

3
foreachは個人的に見やすいと思います。舞台裏では、2つのループはパフォーマンスに関してほとんど同じです。
Chev 2011年

5

もう少し情報を提供する必要があります...

リフレクションを使用するという意味ですか。アセンブリマニフェストを反復処理し、を使用してタイプのリストを取得できます。

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

   myAssembly.ManifestModule.FindTypes()

Visual Studioだけの場合は、インテリセンスウィンドウでリストを取得するか、オブジェクトブラウザー(CTRL + W、J)を開くだけです。


0

Reflectionを使用すると、アセンブリ内のすべてのタイプを校正できます。タイプには、関心のある名前空間のみをフィルタリングするために使用するNamespaceプロパティがあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.