为什么我必须在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");
注意:从某种意义上说,更改名称空间将导致错误,因此您的方法更加严格.另一方面,上述方法的可预测性较差,因为您可能会或可能不想从其他名称空间中选择类.另外,如果同一程序集中有多个具有相同短名称和不同名称空间的类,它将失败.
标签:reflection,types,net-assembly,c,net 来源: https://codeday.me/bug/20191108/2008837.html