2016-09-02 3 views
1

Я попытался прочитать много вопросов о этой теме .Net generics & динамическое кастинг, но до сих пор не вижу, как применить его к моему WPF-приложению.Кастинг с динамическими дженериками

У меня есть один View и ViewModel, с помощью которого я сохраняю данные для нескольких таблиц. Все таблицы имеют одинаковые имена столбцов/полей, которые отображаются в представлении, т. Е. описание, createate и т. д. Я использую один общий View и ViewModel для таблиц, потому что я могу более легко поддерживать и повторно использовать код, если он все в одном файле ViewModel.

Когда я перехожу к представлению, я знаю, какую таблицу загрузить и использовать. Что мне нужно, чтобы быть в состоянии сделать, это выбрать записи в сильно типизированных IEnumerable, как это:

private IEnumerable<Foo> _itemsList; 
switch (_tableName) 
{ 
    case Foo: 
    { 
     _itemsList = (from myrow in UoW.FooRepository.Get() 
      orderby myrow.descr 
      select new FooModel() 
      { 
       foo_id = myrow.foo_id, 
       descr = myrow.descr, 
       createdate = myrow.createdate,     
      }).ToList(); 
     break; 
    } 
} 

Из того, что я прочитал, мне нужно сначала сделать что-то вроде этого:

switch (_tableName) 
{ 
    case Foo: 
    { 
     var mylist = typeof(List<>); 
     Type[] typeArgs = { typeof(Foo) }; 
     var makegenlist = ls.MakeGenericType(typeArgs); 
     object o = Activator.CreateInstance(makegenlist); 
     break; 
    } 
} 

Но каков следующий шаг после создания объекта «o» с помощью Activator? Как я могу создать сильно типизированный IEnumerable для выбора? Заранее спасибо.

ответ

0

Вы уже строите конкретный общий тип (он же «закрытый»). Таким образом, с учетом предположения, что у вас есть к тому времени уже сделано, делая это так, это просто подавленный заключить логику должна работать:

(IEnumerable<Foo>)o 

(потому что, конечно, вы также знаете, что список <> реализует IList <>, IEnumerable <> и т.д.)

(Ваш вопрос дал мне чувство, что вы пытаетесь решить проблему XY, хотя.)

«HTH,

+0

Да, который работает после того, как я изменил мой ViewModel декларация of_itemsList для динамического типа вместо IEnumerable .. Спасибо. – harpagornis

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