如何递归地获取命名空间内的所有命名空间

时间:2011-02-05 08:21:05

标签: c# .net reflection namespaces

简单来说,我希望项目中的所有命名空间都是递归的,并且前面找到的所有命名空间中都有类。

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

我之前使用这部分来获取字符串格式的命名空间。 但现在我也了解了底层名称空间。

1 个答案:

答案 0 :(得分:4)

听起来你可能想要从命名空间到类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);
}