简单的说,我想要递归的找到项目中的所有命名空间,以及所有命名空间中可用的类都在前面找到。
var namespaces = assembly.GetTypes()
.Select(ns => ns.Namespace);
我之前使用这部分来获取字符串格式的命名空间。 但现在我也了解了底层的命名空间。
最佳答案
听起来您可能想要一个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);
}
关于c# - 如何递归获取命名空间内的所有命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4905856/