如何使用反射在 .net core 中通过类名找到其命名空间?

4

我有一个只包含类名的字符串列表,需要使用Activator创建它们的实例,但它们可能在不同的命名空间中。由于这些类可能会在未来移动到另一个命名空间,因此我不能硬编码命名空间。


你是否一定要有一个 string 列表,或者可以使用 Type 列表?如果只有 string,那么当存在多个具有相同名称的类型(在不同的命名空间中)时,你想如何处理这种情况? - Tomas Aschan
很不幸,我被锁定了。类列表来自文本文件,我需要创建适当的对象。 - MKasprzyk
请务必查看此线程:如何获取命名空间中的所有类? - Paul Gorbas
2个回答

5

如果您知道不会有多个具有相同名称的类型驻留在不同的命名空间中,那么您可以遍历程序集中的所有类型并过滤类型名称。例如,以下内容有效:

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

这并不一定会出错,即使有多个同名的类型,但它们都将出现在列表中。

它不适用于 .Net Core。程序集没有 GetAssembly 的定义。 - MKasprzyk
它可以工作,但你可能需要将一个框架程序集依赖项添加到你的project.json中。给我几分钟时间,我会看看能否找出是哪一个。 - Tomas Aschan
使用Net Core,您可以使用typeof(object).GetTypeInfo().Assembly来获取程序集。 - adem caglin

2
您可以获取程序集中的所有类型,并找到那个名称与所需名称相同的类型。
var type = assembly.GetTypes().FirstOrDefault(x => x.Name == name);

注意:名称可能不唯一。在这种情况下,除非您可以对命名空间进行猜测(例如,可能的命名空间列表,“黑名单”命名空间等),否则您将无法找到正确的类型。请注意保留HTML标签。

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