2012-04-30 2 views
1

Использования только .net 3.5 У меня есть класс образца:Instantiate напечатал IEnumerable из компиляции известного типа отражения

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

Ее разновидность ОРМА и мне нужно материализовать коллекцию ленивым вычисленного типа

I пытаясь найти способ присвоить экземпляр свойству Элементов, например, путем 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

Как это работает в большинстве ИЛИ-mapers?

Могу ли я использовать Reflection.Emit для генерации бетонного типа?
Могу ли я использовать Castle/Linfu?

EDIT:

Я Канот использовать любой прямой бросок, потому что он требует ссылки Table2, который я не могу harcode

РЕШЕНИЕ:

Через некоторое время я нашел решение самостоятельно. Для этого нужно использовать отражение для заданного экземпляра:

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

Я не могу использовать любое прямое действие, потому что для этого требуется ссылка Table2, которая не может быть привязана – devi

+0

Ну что ж, вы можете изменить объявление свойства 'Items' в' Table1' на 'object'? –

0

Если вы знаете, что хотите список, почему вы не можете использовать new List<Table2>()? Обычно вы используете только Activator.CreateInstance, когда тип неизвестен до выполнения, часто используя значение конфигурации на основе строки.

Все, что вам нужно сделать, хотя, явно приводится instance либо IEnumerable<Table2> или List<Table2>, либо один должен работать:

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

Я не могу использовать какой-либо прямой трансляции, потому что для этого требуется ссылка Table2, которая не может быть приведена в соответствие – devi

+0

@devi. У вас есть ссылка на таблицу2 в вашем коде: 'var gt = t.MakeGenericType (typeof (Table2));' –

+0

его просто образец , в моем коде я использую GetType() вместо typeof() и типы, на которые не ссылаются – devi

Смежные вопросы