c# - 使用反射 (DotNET) 在程序集中查找所有命名空间

标签 c# vb.net reflection assemblies namespaces

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

理想情况下,我只想将自己限制在顶级命名空间中,所以而不是:

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

你只会得到:

using System;

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

非常感谢, 大卫

最佳答案

不,这没有捷径,尽管 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);
}

我很好奇为什么您只需要顶级命名空间……这似乎是一个奇怪的约束。

关于c# - 使用反射 (DotNET) 在程序集中查找所有命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1549198/

相关文章:

c# - 不允许使用 WHERE 子句的 SqlDependency 查询。我怎样才能修改它是有效的?

c# - 使用Data Virtualization,ViewModel中的属性与View中ItemsControl的SelectedItem绑定(bind)的问题

javascript - 调整图片大小,需要一个好的库

.net - 从 .NET 应用程序发送电子邮件的最佳方式?

haskell - 反射是否有不连贯的风险?

java - 通过反射获取int[]的值

asp.net - 如何在ASP.NET应用程序中创建类的实例

c# - ASP.NET Core 如何将任何类型转换为 Controller 操作的 ActionResult<T> 返回类型?

c# - 在 SHARPMAP 中创建新图层

c# - 如何避免在变量赋值的情况下调用冗余?