我有一个程序集(加载为ReflectionOnly),我想找到这个程序集中的所有命名空间,这样我就可以将它们转换为自动生成的源代码文件模板的"using“(VB中的”Imports“)语句。
理想情况下,我希望仅限于顶级名称空间,而不是:
using System;
using System.Collections;
using System.Collections.Generic;
你只会得到:
using System;
我注意到System.Type类上有一个Namespace属性,但是有没有更好的方法来收集程序集内的名称空间,而不涉及迭代所有类型和剔除重复的名称空间字符串?
非常感谢,大卫
发布于 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);
}
我很好奇为什么你只需要顶级名称空间……这似乎是一个奇怪的限制。
发布于 2009-10-10 22:08:00
名称空间实际上只是类型名称中的一种命名约定,因此它们只是作为一种在许多限定类型名称中重复出现的模式“存在”。所以你必须遍历所有的类型。但是,这方面的代码可能可以编写为单个Linq表达式。
发布于 2009-10-10 22:10:32
这是一种linq的方式,它本质上仍然是遍历每个元素,但代码要干净得多。
var nameSpaces = from type in Assembly.GetExecutingAssembly().GetTypes()
select type.Namespace;
nameSpaces = nameSpaces.Distinct();
此外,如果您的自动生成代码,您可能会更好地完全限定一切,那么您将不必担心生成的代码中的命名冲突。
https://stackoverflow.com/questions/1549198
复制相似问题