通过反射实例化编译已知类型的类型化 IEnumerable

本文关键字:类型 类型化 IEnumerable 反射 实例化 编译 | 更新日期: 2023-09-27 18:32:55

仅使用 .net 3.5 我有示例类:

public class Table1
{
   public IEnumerable<Table2> Items { get; set; }
}

它是一种ORM,我需要通过惰性计算类型实现集合

我试图找到将实例分配给属性项目的方法, 例如通过List<Table2>

当我通过激活器创建实例时,它返回对象,我无法将其转换为所需的类型

var t = typeof(List<>);
var gt = t.MakeGenericType(typeof(Table2));
object instance = Activator.CreateInstance(gt);
var table1 = new Table1();
table1.Items = instance; //canot use cast here

并且将"对象"变量分配给类型化的 IEnumerable 是问题

它在大多数OR映射器中是如何工作的?

我可以使用 Reflection.Emit 生成具体类型吗?
我可以使用城堡/林府吗?

编辑:

我不能使用任何直接转换,因为它需要引用表2,这是我不能编码

溶液:

一段时间后,我自己找到了解决方案。它需要对集合实例使用反射:

var table1 = new Table1();
var table1Type = typeof(Table1);
var prop = table1Type.GetProperty("Items");
prop.SetValue(table1, instance, null);

通过反射实例化编译已知类型的类型化 IEnumerable

我认为你只是缺少一个简单的演员表:

而不是:

table1.Items = instance;

来得及:

table1.Items = instance as IEnumerable<Table2>;

如果你知道你想要一个列表,为什么你不能只使用new List<Table2>()?通常,仅当类型在运行时之前未知时才使用Activator.CreateInstance,通常使用基于字符串的配置值。

但是,您需要做的就是将instance显式转换为IEnumerable<Table2>List<Table2>,其中任何一个都应该有效:

table1.Items = (IEnumerable<Table2>) instance;