通过反射实例化编译已知类型的类型化 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);
我认为你只是缺少一个简单的演员表:
而不是:
table1.Items = instance;
来得及:
table1.Items = instance as IEnumerable<Table2>;
如果你知道你想要一个列表,为什么你不能只使用new List<Table2>()
?通常,仅当类型在运行时之前未知时才使用Activator.CreateInstance
,通常使用基于字符串的配置值。
但是,您需要做的就是将instance
显式转换为IEnumerable<Table2>
或List<Table2>
,其中任何一个都应该有效:
table1.Items = (IEnumerable<Table2>) instance;