为什么Type.GetType()工作而Assembly.GetType()不起作用?

时间:2011-09-11 23:45:16

标签: c# reflection

我正在尝试从程序集列表中找到运行时的类型;我的代码是这样的:

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()的类型呢?

1 个答案:

答案 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()很可能会使用当前程序集的引用来解析类型,因此如果类型存在于不是引用的程序集中,则无法找到它。