如何使用 .net 核心中的反射按名称查找类的命名空间

本文关键字:查找 命名空间 反射 何使用 net 核心 | 更新日期: 2023-09-27 17:56:25

我有一个只有类名的字符串列表。我需要使用激活器创建它们的实例,但它们都可以位于不同的命名空间中。将来可以将类移动到另一个命名空间中,因此我无法对其进行硬编码。

如何使用 .net 核心中的反射按名称查找类的命名空间

如果您知道永远不会有多个同名的类型驻留在不同的命名空间中,则可以循环访问程序集中的所有类型并筛选类型名称。例如,这适用于:

var typenames = new[] { "String", "Object", "Int32" };
var types =  typeof(object).GetTypeInfo().Assembly
    .GetTypes()
    .Where(type => typenames.Contains(type.Name))
    .ToArray(); // A Type[] containing System.String, System.Object and System.Int32

如果您有多个同名的类型,这不一定会中断,但你会在列表中获得所有这些类型。

您可以获取程序集的所有类型,并找到具有相关名称的程序集。

var type = assembly.GetTypes().FirstOrDefault(x => x.Name == name);

注意:名称可能不是唯一的。在这种情况下,你没有机会找到正确的类型,除非你可以对命名空间 8 有一些猜测,例如可能的命名空间列表、命名空间的"黑名单"等。