【问题标题】:Why do I have to specify the namespace in the parameter for assembly.GetType()?为什么我必须在 assembly.GetType() 的参数中指定命名空间?
【发布时间】:2019-02-19 14:02:29
【问题描述】:
举个例子:
var assembly = Assembly.Load("ProjA.Primates");
var myType = assembly.GetType("ProjA.Primates.Bonobo");
如果我没有指定“ProjA.Primates”。子字符串,抛出异常。
为什么在加载的程序集中找不到Bonobo类型?
【问题讨论】:
标签:
c#
.net
reflection
types
.net-assembly
【解决方案1】:
命名空间名称是类型全名的一部分。比如List<T>的全称是System.Collections.Generic.List<T>
在任何地方都使用全名会很不方便,因此 C# 允许您通过在源代码顶部添加 using 指令来跳过命名空间部分。然而,这只是一个编译器技巧,它将命名空间添加到位置列表中以查找类型解析。
您可以使用 LINQ 通过名称(而不是全名)查找类,如下所示:
var myType = assembly.GetTypes().SingleOrDefault(t => t.Name == "Bonobo");
注意:您的方法更严格,因为更改命名空间会导致错误。另一方面,上述方法的可预测性较差,因为您可能希望也可能不想从不同的命名空间中选择一个类。此外,如果同一个程序集中有多个具有相同短名称和不同命名空间的类,它将失败。