c# - 如何递归获取命名空间内的所有命名空间

标签 c# .net reflection namespaces

简单的说,我想要递归的找到项目中的所有命名空间,以及所有命名空间中可用的类都在前面找到。

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

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

最佳答案

听起来您可能想要一个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);
}

关于c# - 如何递归获取命名空间内的所有命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4905856/

相关文章:

Java 等于(): to reflect or not to reflect

c# - 如何在 C# 中使用 System.Reflection.MethodBase 查找方法的返回类型?

c# - 如何在 IIS 上设置 rdlc 报告的自定义位置?

c# - 如何在 Visual Studio 2008 或 Visual Studio 2010 中设置 JavaScript 断点

c# - .NET XML 序列化和空集合

c# - 如何计算C# Mongodb强类型驱动程序中单个属性的平均值

android - 2 条重叠线上的二维线反射

c# - 获取使用javascript计算的按钮单击事件上的gridview模板字段标签值

c# - RichTextBox 文本未显示 C#

c# - 上下文菜单继续使用Mvvm获取错误的对象