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

Ответы:

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)
абатищев 04
8
Также имейте в виду, что Assembly! = Namespace - некоторые пространства имен распределены по нескольким сборкам.
Беван,
1
и почему бы не вернуть просто IEnumerable <Type>? Тем более, что вы выполняете перечисление между результатами, я думаю, что лучше использовать foreach вместо for.
abatishchev 04
2
Хорошие комментарии, спасибо за это. Сделав возвращаемый тип IEnumerable <Type>, отпадает необходимость в последнем вызове ToArray. Не уверен, согласен ли я с тем, что foreach лучше, чем for; На мой взгляд, разницей в производительности можно пренебречь, поэтому я думаю, что дело в личном стиле. Но может быть веский аргумент в пользу предпочтения foreach; если да, не стесняйтесь поделиться им; Мне нравится, когда меня доказывают, что он неправ :)
Фредрик Мёрк
3
Я думаю, что на foreach проще посмотреть лично. За кулисами две петли практически одинаковы по производительности.
Чев
5

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

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

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

   myAssembly.ManifestModule.FindTypes()

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

Эоин Кэмпбелл
источник
0

С помощью Reflection вы перебираете все типы в сборке. Тип имеет свойство Namespace, которое вы используете для фильтрации только интересующего вас пространства имен.

Герри Шенк
источник