C# 使用Assembly.LoadFrom加载泛型类型

C# 使用Assembly.LoadFrom加载泛型类型,c#,generics,late-binding,C#,Generics,Late Binding,参考Jon Skeet的回答: 我需要根据泛型类型的名称以及泛型类型的类型参数的名称加载泛型类型。因此,从Jon的例子来看,我会: string genName = "MyNamespace.Generic"; string itemName = "System.String"; 我有以下代码,它将根据类型名称和完全对齐的程序集名称/路径加载类型。它适用于“简单类型” 我希望这样使用它: //Get the types var genTyp = GetTypeOf(genPath,genNam

参考Jon Skeet的回答:

我需要根据泛型类型的名称以及泛型类型的类型参数的名称加载泛型类型。因此,从Jon的例子来看,我会:

string genName = "MyNamespace.Generic";
string itemName = "System.String";
我有以下代码,它将根据类型名称和完全对齐的程序集名称/路径加载类型。它适用于“简单类型”

我希望这样使用它:

//Get the types
var genTyp = GetTypeOf(genPath,genName);
var itemTyp = GetTypeOf(itemPath,itemName);

//Put them together:
var typ = getType.MakeGenericType(itemTyp);
    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);
这在第一行出现一个
系统。TypeLoadException
说明:

Could not load type <TypeName here> from assembly <AssemblyName here>
无法从程序集加载类型

我尝试了许多创建泛型的方法,包括提供完整的类名
MyNamespace.generic
。当我指定要从包含泛型类型的同一程序集加载的非泛型类型时,它可以正常工作。

不幸的是,将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;
string typeName=typeof(MyNamespace.Generic).Name;
字符串fullTypeName=typeof(MyNamespace.Generic).FullName;

结果应该有助于您获得正确的类型名称。

根据Carsten的上述回答,我将我的
GetTypeOf
方法修改如下:

//Get the types
var genTyp = GetTypeOf(genPath,genName);
var itemTyp = GetTypeOf(itemPath,itemName);

//Put them together:
var typ = getType.MakeGenericType(itemTyp);
    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);
然后,我可以按如下方式使用它:

//Get the types
var genTyp = GetTypeOf(genPath,genName);
var itemTyp = GetTypeOf(itemPath,itemName);

//Put them together:
var typ = getType.MakeGenericType(itemTyp);
    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版本的代码

是否可以加载genType程序集所依赖的所有程序集?是。我能够从genType的程序集中加载一个非泛型类,没有问题。非常感谢-这让我走上了正确的道路。查看我的最终解决方案的答案。