如何获得命名空间中的所有类?


Answers:


142

您将需要“向后”进行;列出程序集中的所有类型,然后检查每种类型的名称空间:

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

8
另外,请记住Assembly!=名称空间-一些名称空间分布在多个程序集中。
Bevan

1
为什么不只返回IEnumerable <Type>?我认为,更何况,您需要在结果之间进行枚举,而且“ foreach”比“ for”更好。
abatishchev

2
好的评论,谢谢。通过将返回类型设置为IEnumerable <Type>,无需进行最后一个ToArray调用。我不确定是否同意“ foreach”比“ for”更好;在我看来,性能差异可以忽略不计,因此我认为这归因于个人风格。但是可能有一个很好的论点,他们更喜欢“ foreach”。如果是这样,请随时分享;我喜欢被证明是错误的:)
FredrikMörk09年

3
我认为foreach只是更易于个人理解。在后台,两个循环在性能方面几乎相同。
CHEV

5

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

您的意思是使用反射。您可以遍历程序集清单并使用以下方法获取类型列表

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

   myAssembly.ManifestModule.FindTypes()

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.