如何使用反射(DotNet)查找程序集中的所有名称空间?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (38)

我有一个程序集(加载为ReflectionOnly),我希望在这个程序集中找到所有的名称空间,这样我就可以将它们转换为“使用”(VB中的“导入”)语句作为自动生成的源代码文件模板。

理想情况下,我只想将自己限制在顶级名称空间上,所以不要:

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

结果却是:

using System;

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

提问于
用户回答回答于

例如,在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);
}
用户回答回答于

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

所属标签

可能回答问题的人

  • 西风

    renzha.net · 站长 (已认证)

    7 粉丝1 提问9 回答
  • 四无君

    0 粉丝0 提问3 回答
  • 拉布拉多拉不多

    1 粉丝0 提问2 回答
  • HKC

    红客学院 · 创始人 (已认证)

    26 粉丝7 提问2 回答

扫码关注云+社区

领取腾讯云代金券