为什么我必须在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按名称(而不是全名)查找类,如下所示:

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

注意:从某种意义上说,更改名称空间将导致错误,因此您的方法更加严格.另一方面,上述方法的可预测性较差,因为您可能会或可能不想从其他名称空间中选择类.另外,如果同一程序集中有多个具有相同短名称和不同名称空间的类,它将失败.

上一篇:C#-将基本类型转换为派生类型


下一篇:JavaScript中的Boolean对象和Boolean数据类型有什么区别?