2009-06-04 2 views
58

Как я могу получить все классы в пространстве имен в C#?Как я могу получить все классы в пространстве имен?

+1

Возможный дубликат [Вывод всех классов определенного имени space] (http://stackoverflow.com/questions/343869/taking-out-all-classes-of-a-specific-namespace) – nawfal

+1

Возможный дубликат [Получение всех типов в пространстве имен через отражение] (https: // stackoverflow.com/questions/79693/getting-all-types-in-a-namespace-via-reflection) – Liam

ответ

108

Вам нужно будет сделать это «назад»; перечислить все типы в сборке, а затем проверка пространства имен каждого типа:

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

. Где (t => String.Equals (t.Namespace, nameSpace, StringComparison.Ordinal) – abatishchev

+6

Кроме того, храните в помните, что Assembly! = namespace - некоторые пространства имен распределены по нескольким сборкам. – Bevan

+1

и почему бы не вернуть только IEnumerable ? Тем более, вы делаете перечисление между результатами, а также «foreach» вместо «for» лучше, я думаю. – abatishchev

0

С рефлексией вы проходите через все типы сборки. Тип имеет свойство пространств имен, которые вы используете для фильтрации только пространство имен вас интересует.

5

Вы должны будете предоставить немного больше информации ...

ли вы имеете в виду с помощью отражения. Вы можете перемещаться через сборки манифеста и получить список типов с использованием

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

    myAssembly.ManifestModule.FindTypes() 

Если это только в Visual Studio, вы можете просто получить список в окне IntelliSense, или открыв обозреватель объектов (CTRL + W , J)

Смежные вопросы