使用动态泛型进行投射

时间:2016-09-02 17:51:19

标签: wpf generics dynamic casting

我确实试过阅读关于.Net generics&的这个主题的许多SO问题。动态转换,但仍然无法看到如何将其应用到我的WPF应用程序。

我有一个View和ViewModel,我用它来维护几个表的数据。这些表都具有在视图中显示的相同列/字段名称,即。我正在为表使用一个常见的View和ViewModel,因为如果代码全部在一个ViewModel文件中,我可以更轻松地维护和重用代码。

当我导航到View时,我知道要加载和使用哪个表。我需要做的是将记录选择为强类型的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;
    }
}

但是使用Activator创建对象'o'之后的下一步是什么?然后,我如何为选择创建强类型的IEnumerable?提前谢谢。

1 个答案:

答案 0 :(得分:0)

您已经构建了一个具体的泛型类型(又称“封闭”类型)。所以,考虑到你已经通过这样做的假设,这个简单的向下转换结束你的逻辑应该工作:

(IEnumerable<Foo>)o

(因为当然,你也知道List&lt;&gt;实现了IList&lt;&gt;,IEnumerable&lt;&gt;等)

(你的问题让我觉得你可能正试图解决XY问题。)

“HTH,

相关问题