1

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

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

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

我试图找到将实例分配给属性 Items的方法,例如通过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

将“对象”变量分配给类型化的 IEnumerable 是个问题

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

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

编辑:

我不能使用任何直接演员,因为它需要参考表2,我不能硬编码

解决方案:

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

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

2 回答 2

0

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

代替:

table1.Items = instance;

做了:

table1.Items = instance as IEnumerable<Table2>;
于 2012-04-30T21:12:01.027 回答
0

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

但是,您需要做的只是明确地instance转换为IEnumerable<Table2>or List<Table2>,任何一个都应该工作:

table1.Items = (IEnumerable<Table2>) instance;
于 2012-04-30T21:16:12.957 回答