为什么Type.GetType()有效而Assembly.GetType)无效

本文关键字:GetType Assembly 无效 有效 为什么 Type | 更新日期: 2023-09-27 18:08:11

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

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((,浏览到我试图实例化的类,然后调用程序集。GetType("MyNamespace.MyClass,MyNamespace"(。

有人知道为什么使用Type.GetType((搜索所有程序集都有效,但搜索我知道的包含使用程序集的类型的程序集。GetType((没有?

为什么Type.GetType()有效而Assembly.GetType)无效

从这两个方法的MSDN文档中,Type.GetType()需要类型的程序集限定名,而Assembly.GetType()需要类型的全名。这不是一回事。

typeof(MyNamespace.MyClass).AssemblyQualifiedName的计算结果是一个类型的程序集限定名(类似于MyNamespace.MyClass, MyAssembly, Version=1.0.0.0, Culture=neutral(,因此它不适用于Assembly.GetType()调用,该调用需要格式为MyNamespace.MyClass的字符串。

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


需要注意的事项:

如果您像您所说的那样"试图在运行时从程序集列表中找到一个类型",那么您可能最好对列表中的每个程序集使用Assembly.GetType()调用并传入类型的全名。Type.GetType()很可能使用当前程序集的引用来解析该类型,因此,如果该类型存在于不是引用的程序集中,则找不到它。