在下面的代码片段中,最后一行的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?