使用Assembly.LoadFrom加载generics类型

请参考Jon Skeet的答案: 将实例化System.Type作为generics类的类型参数传递

我需要根据generics类型的名称加载一个Generic类型,以及作为generics的type参数的类型的名称。 所以从Jon的例子中我会得到:

string genName = "MyNamespace.Generic"; string itemName = "System.String"; 

我有以下代码将加载基于类型名称和完全对齐的程序集名称/路径的类型。 它适用于“简单类型”

 public Type GetTypeOf(string assemblyPath, string className) { var asmbly = System.Reflection.Assembly.LoadFrom(assemblyPath); //open assembly return asmbly.GetType(className, true, true); //throws error, not case sensitive } 

我希望使用如下:

 //Get the types var genTyp = GetTypeOf(genPath,genName); var itemTyp = GetTypeOf(itemPath,itemName); //Put them together: var typ = getType.MakeGenericType(itemTyp); 

这将在System.TypeLoadException的第一行中出现:

 Could not load type  from assembly  

我已经尝试了许多创建generics的排列,包括提供完整的类名MyNamespace.Generic 。 当我指定从包含generics类型的同一程序集加载非generics类型时,它可以正常工作。

不幸的是,使用带有generics类型的GetType并不可读。 您必须使用完全限定类型名称,即使对于通用参数: 例如, TestType读取如下:

 TestType`1[[System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] 

您的示例代码不包含类型声明,因此您必须使用它。 您可以尝试使用此代码段并查看调试器所说的内容:

 string typeName = typeof(MyNamespace.Generic<>).Name; string fullTypeName = typeof(MyNamespace.Generic<>).FullName; 

结果应该可以帮助您获取正确的类型名称。

根据Carsten上面的回答,我调整了我的GetTypeOf方法,如下所示:

  public Type GetGenericTypeOf(string assemblyPath, string genericClass, string itemQualifiedClass) { string typString = String.Format("{0}`1[[{1}]]",genericClass,itemQualifiedClass) var asmbly = System.Reflection.Assembly.LoadFrom(assemblyPath); //open assembly return asmbly.GetType(typString, true, true); //throws error, not case sensitive } 

然后我可以使用它如下:

 var itemTyp = GetTypeOf(itemPath,itemName); var genTyp = GetGenericTypeOf(genPath,genName,itemTyp.AssemblyQualifiedName); //This genTyp is then good to go: var genInst = Activator.CreateInstance(getTyp); 

不需要MakeGenericType因为返回的genType会绕过此步骤。

我现在已经完整地写了这个,包括我博客上的VB.Net版本的代码。