2012-04-30 128 views
1

只使用.NET 3.5,我有樣品等級:實例化類型編譯已知類型的IEnumerable的反射

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

它是一種ORM的,我需要通過一個懶惰的計算類型

我兌現集合試圖找到辦法通過例如List<Table2>

當我被激活創建實例分配財產項目, 例如,它返回對象,我不能轉換爲所需ŧ YPE

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嗎?

編輯:

我canot使用任何直接鑄造的,因爲它需要參考表2 是我不能harcode

SOLUTION:

一段時間後,我發現溶液自己。它需要用反射的集合例如:

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

「這我不能轉換爲所需類型」 - 爲什麼不呢? –

+0

奧斯汀薩洛寧,看到編輯 – devi

回答

0

我認爲你只是缺少一個簡單的轉換:中

代替:

table1.Items = instance; 

使其:

table1.Items = instance as IEnumerable<Table2>; 
+0

我canot使用任何直接鑄造的,因爲它需要參考表2是我不能harcode – devi

+0

那麼你可以改變'Table1'了'Items'財產申報的'object'呢? –

0

如果你知道你想要一個列表,爲什麼你不能只使用new List<Table2>()?通常只使用Activator.CreateInstance,直到運行時才知道類型,通常使用基於字符串的配置值。

所有你需要做的,雖然是顯式轉換instance要麼IEnumerable<Table2>List<Table2>,任何一個應該工作:

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

我canot使用任何直接鑄造的,因爲它需要參考表2是我不能harcode – devi

+0

@devi你在你的代碼,以表2的引用:'變種GT = t.MakeGenericType(typeof運算(表2));' –

+0

它只是樣品,在我的代碼中,我使用GetType()而不是typeof()和類型未引用 – devi