Як я можу отримати всі класи в просторі імен?


80

Як я можу отримати всі класи в просторі імен у C #?



Відповіді:


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)
абатищев

8
Також майте на увазі, що Assembly! = Простір імен - деякі простори імен розподілені по декількох збірках.
Беван,

1
а чому б не повернути просто IEnumerable <Type>? Тим більше, ви робите перерахування між результатами, я також думаю, що краще "foreach" замість "for".
абатищев

2
Гарні коментарі, дякую за це. Здійснюючи тип повернення до IEnumerable <Type>, виключається необхідність останнього виклику ToArray. Не впевнений, чи погоджуюсь я з тим, що "foreach" краще, ніж "for"; як я бачу, різницю в продуктивності неможливо знехтувати, тому я думаю, що це зводиться до особистого стилю. Але може мати вагомий аргумент, віддаючи перевагу «foreach»; якщо так, то сміливо діліться ним; Мені подобається, коли мене доказують неправильно :)
Фредрік Мерк,

3
Я думаю, що на foreach просто легше дивитись особисто. За лаштунками ці дві петлі майже однакові щодо продуктивності.
Chev

5

Вам потрібно буде надати трохи більше інформації ...

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

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

   myAssembly.ManifestModule.FindTypes()

Якщо це лише у Visual Studio, ви можете просто отримати список у вікні intellisense або відкривши браузер об’єктів (CTRL + W, J)


0

За допомогою Reflection ви прокручуєте всі типи в збірці. Тип має властивість простору імен, яке ви використовуєте для фільтрування лише того простору імен, який вас цікавить.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.