Как рекурсивно получить все пространства имен внутри пространства имен - PullRequest
4 голосов
/ 05 февраля 2011

Проще говоря, я хочу рекурсивно использовать все пространства имен в проекте и классы, доступные во всех найденных ранее пространствах имен.

var namespaces = assembly.GetTypes()
                  .Select(ns => ns.Namespace);

Я использую эту часть ранее, чтобы получить пространства имен в строковом формате.Но теперь я также узнал основные пространства имен.

1 Ответ

4 голосов
/ 05 февраля 2011

Звучит так, как будто вы могли бы хотеть Lookup из пространства имен в класс:

var lookup = assembly.GetTypes().ToLookup(t => t.Namespace);

Или альтернативно (и очень похоже) вы могли бы использовать GroupBy:

var groups = assembly.GetTypes().GroupBy(t => t.Namespace);

Например:

var groups = assembly.GetTypes()
                     .Where(t => t.IsClass) // Only include classes
                     .GroupBy(t => t.Namespace);
foreach (var group in groups)
{
    Console.WriteLine("Namespace: {0}", group.Key);
    foreach (var type in group)
    {
        Console.WriteLine("  {0}", t.Name);
    }
}

Тем не менее, не совсем ясно, что вы ищете.Это даст вам классы в каждом пространстве имен, но я не знаю, действительно ли это то, что вы ищете.

Два момента, о которых следует помнить:

  • Там нет ничегорекурсивно об этом
  • Пространства имен на самом деле не образуют иерархию, насколько это касается CLR.Нет такого понятия, как «базовое» пространство имен.У самого языка C # есть некоторые правила по этому поводу, но что касается CLR, не существует такого понятия, как "родительское" пространство имен.

Если вы действительно хотите перейти от "Foo.Bar.Baz" к "Foo.Bar" и "Foo", тогда вы можете использовать что-то вроде:

while (true)
{
    Console.WriteLine(ns);
    int index = ns.LastIndexOf('.');
    if (index == -1)
    {
        break;
    }
    ns = ns.Substring(0, index);
}
...