我正在尝试从程序集列表中找到运行时的类型;我的代码是这样的:
foreach (Assembly assembly in assembliesToSearch)
{
Type t = assembly.GetType(assemblyName);
if (t != null)
{
return t;
}
}
,我遇到的问题是t始终为null。在VS2010中使用调试器和中间窗口,我在循环中放置断点时注意到以下内容:
Type.GetType(typeof(MyNamespace.MyClass).AssemblyQualifiedName)
工作正常,但
assembly.GetType(typeof(MyNamespace.MyClass).AssemblyQualifiedName)
没有(当程序集是我知道包含我正在寻找的类的程序集时 - 在调试器中,我可以在assembly.GetTypes()上查看,浏览到我试图实例化的类,并调用assembly.GetType(“MyNamespace.MyClass,MyNamespace”))。
有没有人知道为什么使用Type.GetType()搜索所有程序集都有效,但是搜索我知道的程序集包含使用assembly.GetType()的类型呢?
答案 0 :(得分:10)
在这两种方法的MSDN文档中,Type.GetType()
需要程序集限定类型的名称,而Assembly.GetType()
需要类型的全名< / strong>即可。这些不是一回事。
typeof(MyNamespace.MyClass).AssemblyQualifiedName
求值为类型的程序集限定名称(类似MyNamespace.MyClass, MyAssembly, Version=1.0.0.0, Culture=neutral
),因此它不适用于Assembly.GetType()
调用,该调用期望格式为{的字符串{ {1}}。
这可能是因为当您将程序集限定名称传递给MyNamespace.MyClass
调用时,它正在程序集中查找其全名与您提供的名称相匹配的类型。它找不到一个,所以你得到Assembly.GetType()
返回。 null
调用不是这种情况,因为它期望获得类型的程序集限定名称,并且可以找到程序集和类型。
需要注意的事项:
如果你正在“尝试从程序集列表中找到一个类型”,正如你所说,你可能最好在列表中的每个程序集上使用Type.GetType()
调用并传入类型的全名。 Assembly.GetType()
很可能会使用当前程序集的引用来解析类型,因此如果类型存在于不是引用的程序集中,则无法找到它。