c# - 使用 Assembly.LoadFrom 加载泛型类型

标签 c# generics late-binding

在这里引用 Jon Skeet 的回答:Pass An Instantiated System.Type as a Type Parameter for a Generic Class

我需要根据泛型类型的名称和作为泛型类型参数的类型的名称加载泛型类型。所以从乔恩的例子我会:

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 <TypeName here> from assembly <AssemblyName here>

我尝试了多种创建泛型的排列方式,包括提供完整的类名 MyNamespace.Generic<System.String> .当我指定要从包含泛型类型的同一程序集加载非泛型类型时,它可以正常工作。

最佳答案

不幸的是,将 GetType 与泛型一起使用可读性不佳。您必须使用完整的限定类型名称,即使对于通用参数也是如此:。例如,TestType<object>读起来是这样的:

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;

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

关于c# - 使用 Assembly.LoadFrom 加载泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12036247/

相关文章:

oop - 如何强制仅调用父类(super class)的方法,尽管它们已被重写(在 Ocaml 中)

c# - 如何更改 Windows 服务的名称?

c# - 防止 "Edit"用户控件上的 CSS 更改?

c# - 不能对数据列表中的 CheckBoxList 使用 RequiredFieldValidator

c++ - 压扁容器容器的通用函数

c# - 通用协变和逆变

java - spring batch rowNum不增加

vba - 将早期绑定(bind)代码转换为后期绑定(bind)

C# 不能使用 **as** 将基类转换为派生类

generics - 此语法是什么意思 (<T=Self>) 以及何时使用它?