2011-09-11 37 views
5

我试图从程序集列表中查找运行时的类型;我的代码是这样的:为什么Type.GetType()工作和Assembly.GetType()不起作用?

foreach (Assembly assembly in assembliesToSearch) 
{ 
    Type t = assembly.GetType(assemblyName); 
    if (t != null) 
    { 
     return t; 
    } 
} 

,而我的问题是,t总是会出现为空。与调试器和VS2010中级窗口中播放的时候,我注意到当我把一个断点在循环中执行以下操作:

Type.GetType(typeof(MyNamespace.MyClass).AssemblyQualifiedName) 

工程确定,但

assembly.GetType(typeof(MyNamespace.MyClass).AssemblyQualifiedName) 

不(装配时是我知道的程序集包含我正在寻找的类 - 在调试器中,我可以在assembly.GetTypes()上放置一个监视器,浏览到我尝试实例化的类,并调用assembly.GetType(“MyNamespace.MyClass ,MyNamespace“))。

有谁知道为什么使用Type.GetType()搜索所有程序集的作品,但搜索我知道的程序集包含使用assembly.GetType()类型不?

回答

9

从MSDN文档的两种方法,Type.GetType()预计的类型的组件限定名称Assembly.GetType()期望类型的全名。这些不是一回事。

typeof(MyNamespace.MyClass).AssemblyQualifiedName计算结果为A型(类似MyNamespace.MyClass, MyAssembly, Version=1.0.0.0, Culture=neutral)的程序集限定名称,因此它不会与Assembly.GetType()呼叫时,在格式MyNamespace.MyClass期待一个字符串工作。

这可能是因为当您将组件限定名称传递给Assembly.GetType()调用时,它正在程序集中查找名称与您提供的全名匹配的类型。它找不到一个,所以你得到一个返回nullType.GetType()调用不是这种情况,因为它期望获得一个类型的程序集限定名称并且可以定位程序集和类型。


一些需要注意的:

如果您正在“试图从组件的列表中找到一种在运行时”照你这么说,你可能最好使用在每个组件的Assembly.GetType()通话列表并传入该类型的全名。 Type.GetType()很可能会使用当前程序集的引用来解析类型,因此如果该类型存在于不是引用的程序集中,将不会被找到。

+0

感谢您的回应;我最初的代码示例没有清楚地显示出来,但是在我的循环中,我调用了Type t = assembly.GetType(assemblyName),assemblyName是“MyNamespace.MyClass,MyAssembly”,所以通过我的计算,它应该返回预期类型。 –

+0

@David:'MyNamespace.MyClass,MyAssembly'仍然是一个程序集限定的类型名称。您需要从该字符串中删除程序集名称以使其与'Assembly.GetType()'一起使用。 – adrianbanks

+0

@adrianbanks - 你在哪里学习的“Type.GetType()很可能会使用当前程序集的引用来解析类型” - 它似乎不在[MSDN here]中(http:// msdn .microsoft.com/EN-US /库/ w3f99sx1(v = vs.110)的.aspx)。另外,什么是“当前组装”?在我现在看的情况下,装配的类型 - 这是发现! - 不是具有当前执行方法的程序集,也不是它的引用,但它是调用堆栈上的程序集。(我的问题的原因:我的程序集名称中的版本是错误的,但找到了类型。) – davidbak

相关问题