即使使用完整程序集限定类型名称,Type.GetType也返回null

时间:2016-05-17 15:36:53

标签: c# reflection system.reflection

在下面的代码片段中,最后一行的Type.GetType有时会返回null。

string assemblyName = "My.AssemblyName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null";
string typeName = "My.Namespaced.ClassName";
Type t1 = AppDomain.CurrentDomain.GetAssemblies()
        .SelectMany(x => x.GetTypes())
        .FirstOrDefault(x => x.FullName == typeName &&
                             x.Assembly.FullName == assemblyName);
string qualifiedName = t1.AssemblyQualifiedName; // this result looks sane
Type t2 = Type.GetType(qualifiedName); // returns null

如您所见,我使用Type.AssemblyQualifiedName返回的完全限定名称,并且正如预期的那样,qualifiedName的值为My.Namespaced.ClassName, My.AssemblyName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null

在我的callstack的某个时刻,Type.GetType返回预期的类型,但是,如果我们调用另一个程序集,完全相同的代码片段会导致t1找到类型,但是t2为空。

这里没有任何泛型,我从@Eris理解有时会导致Type.AssemblyQualifiedName的空值。在这种情况下,AssemblyQualifiedName有效。

当人们没有使用汇编限定名称时,我看到StackOverflow上堆满了重复的问题,但事实并非如此。

更新 我认为这个问题可以归结为以下问题:在什么情况下,如果我们有一个非空Type t,其AssemblyQualifiedName属性是typename和assembly的正确组合,可以{{1} } return null?

0 个答案:

没有答案