Звучит так, как будто вы могли бы хотеть 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);
}