仅使用.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);
答案 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;