【问题标题】:How to get all namespaces inside a namespace recursively如何递归地获取命名空间内的所有命名空间
【发布时间】:2011-06-21 19:24:33
【问题描述】:

简单地说,我希望项目中的所有命名空间都递归,并且类在之前找到的所有命名空间中都可用。

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

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

【问题讨论】:

    标签: c# .net reflection namespaces


    【解决方案1】:

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

    但是,这是否是您所追求的并不完全清楚。这将为您提供每个命名空间中的类,但我不知道这是否真的是您要寻找的。​​p>

    要记住两点:

    • 这没有递归
    • 就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);
    }
    

    【讨论】:

    • @Jon Skeet:非常感谢。尤其是您对 .Net 的了解非常好。我想成为你的学生。 :)
    • @Jon Skeet:我也想了解更多关于反射的信息。我之前低估了反射。所以我想了解更多关于这方面的信息。有什么方法可以让我获得关于这个主题的大部分实验知识。我知道一种方法,尝试。 :) 如果有任何来源,请建议我。
    • @Prakash:说实话,在反思方面尝试是一个非常好的选择。查看 Type 和 MethodInfo 之类的所有成员,并思考它们可能有用的地方。
    • @Jon Skeet:您提供的代码应该更新为只提供类。现在它给出了命名空间中的所有类型,包括接口、枚举、结构。以及如何从类中过滤抽象类..?
    • @Prakash:只需在 LINQ 查询中使用“Where”调用,例如使用 Type.IsClass。我将编辑那个答案;对于其他条件,您只需调整该条件。
    猜你喜欢
    • 2014-05-10
    • 2011-01-07
    • 1970-01-01
    • 2011-03-22
    • 2010-10-31
    • 1970-01-01
    相关资源
    最近更新 更多