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

73 .net c# reflection namespaces

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

Fre*_*örk 132

你需要"倒退"; 列出程序集中的所有类型,然后检查每种类型的命名空间:

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

用法示例:

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

对于.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);
}
Run Code Online (Sandbox Code Playgroud)

  • 另外,请记住Assembly!= namespace - 一些名称空间分布在多个程序集中. (7认同)
  • .Where(t => String.Equals(t.Namespace,nameSpace,StringComparison.Ordinal) (2认同)
  • 好的评论,谢谢你.通过将返回类型设置为IEnumerable <Type>,无需最后一次ToArray调用.不确定我是否同意'foreach'比'for'更好; 我认为它的性能差异是可以忽略的,所以我认为这取决于个人风格.但是对于偏爱'foreach'可能有一个很好的论据; 如果是这样,请随意分享; 我喜欢被证明是错的:) (2认同)
  • 我认为foreach更容易个人看待.在幕后,两个循环在性能方面几乎相同. (2认同)

Eoi*_*ell 5

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

你的意思是使用反射.您可以遍历程序集Manifest并使用获取类型列表

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

   myAssembly.ManifestModule.FindTypes()
Run Code Online (Sandbox Code Playgroud)

如果它只是在Visual Studio中,您可以在intellisense窗口中获取列表,或打开对象浏览器(CTRL + W,J)