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

Dav*_*eny 6 c# reflection

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

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

,我遇到的问题是t总是出现为null.在VS2010中使用调试器和中间窗口,我在循环中放置一个断点时注意到以下内容:

Type.GetType(typeof(MyNamespace.MyClass).AssemblyQualifiedName)
Run Code Online (Sandbox Code Playgroud)

工作正常,但是

assembly.GetType(typeof(MyNamespace.MyClass).AssemblyQualifiedName)
Run Code Online (Sandbox Code Playgroud)

没有(当程序集是我知道包含我正在寻找的类的程序集 - 在调试器中,我可以在assembly.GetTypes()上查看,浏览到我试图实例化的类,并调用程序集.GetType("MyNamespace.MyClass,MyNamespace")).

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

adr*_*nks 10

从这两种方法的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()调用时,它正在程序集中查找其全名与您提供的名称相匹配的类型.它找不到一个,所以你得到一个null返回.Type.GetType()调用不是这种情况,因为它希望获得类型的程序集限定名称,并且可以找到程序集和类型.


需要注意的事项:

如果你正在"试图从程序集列表中找到一个类型",你可能最好Assembly.GetType()在列表中的每个程序集上使用调用并传入类型的全名.Type.GetType()很可能会使用当前程序集的引用来解析类型,因此如果类型存在于不是引用的程序集中,则不会找到它.