如何获取命名空间内的所有类?

97
我该如何在C#中获取命名空间内的所有类?

1
可能是取出特定命名空间的所有类的重复问题。 - nawfal
2
可能是通过反射获取命名空间中的所有类型的重复问题。 - Liam
3个回答

167

您需要“倒过来”做;列出程序集中的所有类型,然后检查每个类型的命名空间:

using System.Reflection;
private Type[] GetTypesInNamespace(Assembly assembly, string nameSpace)
{
    return 
      assembly.GetTypes()
              .Where(t => String.Equals(t.Namespace, nameSpace, StringComparison.Ordinal))
              .ToArray();
}

使用示例:

Type[] typelist = GetTypesInNamespace(Assembly.GetExecutingAssembly(), "MyNamespace");
for (int i = 0; i < typelist.Length; i++)
{
    Console.WriteLine(typelist[i].Name);
}

在 .Net 2.0 之前,Assembly.GetExecutingAssembly() 是不可用的,因此您需要一个小技巧来获取程序集:

Assembly myAssembly = typeof(<Namespace>.<someClass>).GetTypeInfo().Assembly;
Type[] typelist = GetTypesInNamespace(myAssembly, "<Namespace>");
for (int i = 0; i < typelist.Length; i++)
{
    Console.WriteLine(typelist[i].Name);
}

2
.Where(t => String.Equals(t.Namespace, nameSpace, StringComparison.Ordinal) - abatishchev
9
请注意,程序集(Assembly)并不等同于命名空间(namespace),有些命名空间可能会跨越多个程序集。 - Bevan
1
为什么不返回一个IEnumerable<Type>呢?而且,你在结果之间进行枚举,使用'foreach'而不是'for'更好,我认为。 - abatishchev
2
好的评论,谢谢。将返回类型设置为IEnumerable<Type>可以消除最后一个ToArray调用的需要。不确定是否同意“foreach”比“for”更好;我认为性能差异可以忽略不计,所以我认为这取决于个人风格。但是,如果您有喜欢“foreach”的充分理由,请随时分享;我喜欢被证明是错误的 :) - Fredrik Mörk
4
个人认为使用foreach更易于阅读。就性能而言,这两个循环在后台基本相同。 - Chev
@Chev 我同意,我会使用IEnumerableforeach循环。 - kwitee

4

您需要提供更多信息...

您是指使用反射吗?您可以遍历程序集的清单并使用以下代码获取类型列表

   System.Reflection.Assembly myAssembly = Assembly.LoadFile("");

   myAssembly.ManifestModule.FindTypes()

如果只是在 Visual Studio 中,您可以在智能感知窗口中获取列表,或通过打开对象浏览器(CTRL + W,J)来获取列表。


0
使用反射,您可以循环遍历程序集中的所有类型。类型具有命名空间属性,您可以使用它来过滤出您感兴趣的命名空间。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接