📜  c# 按命名空间获取所有类 - C# (1)

📅  最后修改于: 2023-12-03 14:39:46.797000             🧑  作者: Mango

C# 按命名空间获取所有类

在 C# 中,命名空间(namespace)是一种组织类和其他类型的一种方式。为了方便对命名空间中的类进行操作或组织,我们有时需要获取某一个命名空间中所有的类。下面介绍几种在 C# 中实现这个功能的方法。

方法一:使用反射获取当前程序集的所有类型

使用 C# 中的反射技术,我们可以获取当前程序集中所有的类型,然后筛选出某一命名空间下的类型。具体实现代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;

namespace YourNamespace
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Type> types = Assembly.GetExecutingAssembly().GetTypes().ToList();
            List<Type> namespaceTypes = types.Where(t => t.Namespace == "YourNamespace").ToList();
            foreach (Type type in namespaceTypes)
            {
                Console.WriteLine(type.FullName);
            }
        }
    }
}

上述代码通过 Assembly 类的 GetExecutingAssembly() 方法获取当前程序集,然后通过 GetTypes() 方法获取所有的类型列表。接着利用 LINQ 中的 Where() 方法来筛选出命名空间为 "YourNamespace" 的类型列表,最后通过遍历输出这些类型的名称。

方法二:使用反射获取所有程序集的所有类型

上述方法只能获取当前程序集中的所有类型,如果需要获取所有程序集中命名空间为 "YourNamespace" 的所有类型,可以使用以下代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;

namespace YourNamespace
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Type> types = new List<Type>();
            AppDomain.CurrentDomain.GetAssemblies().ToList().ForEach(a => types.AddRange(a.GetTypes()));
            List<Type> namespaceTypes = types.Where(t => t.Namespace == "YourNamespace").ToList();
            foreach (Type type in namespaceTypes)
            {
                Console.WriteLine(type.FullName);
            }
        }
    }
}

上述代码通过 AppDomain 类的 CurrentDomain 属性获取当前应用程序域,然后通过 GetAssemblies() 方法获取所有的程序集。接着利用反射获取每个程序集中的所有类型,合并到 types 列表中。最后同样使用 LINQ 中的 Where() 方法来筛选出命名空间为 "YourNamespace" 的类型列表,最后通过遍历输出这些类型的名称。

方法三:使用元数据文件获取类型信息

上述方法需要加载所有的程序集才能获取所有类型,耗时比较长。在某些情况下,我们可以直接使用编译好的元数据文件获取类型信息,以加快获取速度。具体实现代码如下:

using System;
using System.Linq;
using System.Reflection;
using System.Runtime.Loader;

namespace YourNamespace
{
    class Program
    {
        static void Main(string[] args)
        {
            Assembly assembly = AssemblyLoadContext.Default.LoadFromAssemblyPath(@"YourNamespace.dll");
            var namespaceTypes = assembly.GetTypes().Where(t => t.Namespace == "YourNamespace").ToList();
            foreach (Type type in namespaceTypes)
            {
                Console.WriteLine(type.FullName);
            }
        }
    }
}

上述代码使用 AssemblyLoadContext 类的 Default 属性获取默认的程序集加载上下文,并使用其 LoadFromAssemblyPath() 方法加载元数据文件,获取 Assembly 类实例。接着就可以通过反射获取该程序集中的所有类型,同样使用 LINQ 中的 Where() 方法来筛选出命名空间为 "YourNamespace" 的类型列表,最后通过遍历输出这些类型的名称。

到此为止,我们介绍了三种获取命名空间中所有类型的方法,分别是使用反射获取当前程序集的所有类型、使用反射获取所有程序集的所有类型和使用元数据文件获取类型信息。视具体情况选用不同的方法来实现获取类型信息的目的。