通过反射创建两个以上参数的泛型类型

本文关键字:两个 参数 泛型类型 反射 创建 | 更新日期: 2023-09-27 18:04:06

基本上,我有:

public class Gen<T, U> { }

我想通过这个类的反射创建一个泛型类型。我尝试了以下操作,所有结果都为空:

var asm = typeof(Program).Assembly;
var gen1 = asm.GetType("Gen`2"); // null 
var gen2 = asm.GetType("Gen<>"); // null 
var gen3 = asm.GetType("Gen");   // null

这个没有编译:

var t = typeof(Gen<>).MakeGenericType(typeof(int), typeof(string));

我怎样才能达到我想要的?为什么最后一条语句没有编译?那"第二代"呢,难道这就不行吗?

通过反射创建两个以上参数的泛型类型

正确的语法是:

var t = typeof(Gen<,>).MakeGenericType(typeof(int), typeof(string));

(注意<>之间有逗号)

要通过反射获得Gen<T, U>类,必须指定该类型的全名,包括命名空间:

var gen = asm.GetType("TheNamespace.Gen`2");

如果Gen<T, U>类是嵌套的,则必须使用+:

将其名称与其封闭类型名称分开。
var gen = asm.GetType("TheNamespace.EnclosingType+Gen`2");