为什么我必须在 assembly.GetType() 的参数中指定名称空间?

Why do I have to specify the namespace in the parameter for assembly.GetType()?

举个例子:

var assembly = Assembly.Load("ProjA.Primates");
var myType = assembly.GetType("ProjA.Primates.Bonobo");

如果我没有指定 "ProjA.Primates." 子字符串,则会抛出异常。

为什么在加载的程序集中找不到Bonobo类型?

命名空间名称是类型全名的一部分。例如List<T>的全名是System.Collections.Generic.List<T>

在任何地方都使用全名会很不方便,因此 C# 允许您通过在源代码顶部添加 using 指令来跳过命名空间部分。然而,这只是一个编译器技巧,将命名空间添加到查找类型解析的位置列表中。

您可以使用 LINQ 按名称(而不是全名)查找 class,如下所示:

var myType = assembly.GetTypes().SingleOrDefault(t => t.Name == "Bonobo");

注意:您的方法更严格,因为更改命名空间会导致错误。另一方面,上面的方法不太可预测,因为您可能想也可能不想从不同的命名空间中选择 class。此外,如果在同一个程序集中有多个 class 具有相同的短名称和不同的命名空间,它将失败。