首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用反射查找程序集中的所有命名空间(DotNET)

使用反射查找程序集中的所有命名空间(DotNET)
EN

Stack Overflow用户
提问于 2009-10-11 06:03:38
回答 6查看 18.8K关注 0票数 20

我有一个程序集(加载为ReflectionOnly),我想找到这个程序集中的所有命名空间,这样我就可以将它们转换为自动生成的源代码文件模板的"using“(VB中的”Imports“)语句。

理想情况下,我希望仅限于顶级名称空间,而不是:

using System;
using System.Collections;
using System.Collections.Generic;

你只会得到:

using System;

我注意到System.Type类上有一个Namespace属性,但是有没有更好的方法来收集程序集内的名称空间,而不涉及迭代所有类型和剔除重复的名称空间字符串?

非常感谢,大卫

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-10-10 22:10:11

不,这没有捷径,尽管LINQ让它变得相对容易。例如,在C#中,原始的“名称空间集”将是:

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

要获得顶级名称空间,您可能应该编写一个方法:

var topLevel = assembly.GetTypes()
                       .Select(t => GetTopLevelNamespace(t))
                       .Distinct();

...

static string GetTopLevelNamespace(Type t)
{
    string ns = t.Namespace ?? "";
    int firstDot = ns.IndexOf('.');
    return firstDot == -1 ? ns : ns.Substring(0, firstDot);
}

我很好奇为什么你只需要顶级名称空间……这似乎是一个奇怪的限制。

票数 38
EN

Stack Overflow用户

发布于 2009-10-10 22:08:00

名称空间实际上只是类型名称中的一种命名约定,因此它们只是作为一种在许多限定类型名称中重复出现的模式“存在”。所以你必须遍历所有的类型。但是,这方面的代码可能可以编写为单个Linq表达式。

票数 4
EN

Stack Overflow用户

发布于 2009-10-10 22:10:32

这是一种linq的方式,它本质上仍然是遍历每个元素,但代码要干净得多。

var nameSpaces = from type in Assembly.GetExecutingAssembly().GetTypes()
                 select  type.Namespace;
nameSpaces = nameSpaces.Distinct();

此外,如果您的自动生成代码,您可能会更好地完全限定一切,那么您将不必担心生成的代码中的命名冲突。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1549198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档