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

时间:2012-04-30 21:00:49

标签: c# generics reflection

仅使用.net 3.5我有样本类:

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

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

实现物品集合

我尝试找到将实例分配给属性的方法,  例如List<Table2>

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

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

将'object'变量分配给键入的IEnumerable

是个问题

它在大多数OR-mapers中是如何工作的?

我可以使用Reflection.Emit生成具体类型吗?
我可以使用Castle / Linfu吗?

编辑:

我可以使用任何直接投射,因为它需要参考 Table2 ,这是我无法编码

解决方案:

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

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

2 个答案:

答案 0 :(得分:0)

我认为你只是错过了一个简单的演员:

而不是:

table1.Items = instance;

制作:

table1.Items = instance as IEnumerable<Table2>;

答案 1 :(得分:0)

如果您知道自己想要一个List,为什么不能只使用new List<Table2>()?通常,只有在运行时才知道类型时才使用Activator.CreateInstance,通常使用基于字符串的配置值。

但是,您需要做的只是明确地instance IEnumerable<Table2>List<Table2>,任何一个应该有效:

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