我是菜鸟,想用Ibatis.net做个数据库通用操作方法,在其中遇到数据库查询时返回的都是IList<Object>,为了代码简洁,怎样将最终的查询转换成Ilist<实体>,
如以下代码:
    
    IList<object> objects;
    IList<menu> ml;
    objects = IService.GetAll("SelectAllmenu");
    foreach (object o in objects)
        {
            ml.Add((menu)o);
        } 
在运行到ml.Add((menu)o)时报错未将对象引用设置到对象的实例,请教这类需求设计是否合理,应该如何实现,类型转换应该怎样实现?谢谢大大们,木有分了只有30分了

解决方案 »

  1.   

    ml = objects.Cast<menu>().ToList();
      

  2.   


    对!需要  using System.Linq;
      

  3.   

    可惜我用的.NET2.0啊,不支持LINQ,有没有其他办法呢?
      

  4.   

    你定义了IList<menu> ml;
    却没有实例化它啊,至少要IList<menu> ml = new List<menu>()一下
      

  5.   

    IList<menu> ml;
    =>
    IList<menu> ml = new List<menu>();
      

  6.   

    悲剧啊,还在针对net2.0平台上开发。不过即使如此也可以这样写个转换:public static IEnumerable<TA> GetTA<TA>(IEnumerable<object> array)
    {
        foreach (TA x in array)
            yield return x;
    }
    这样你想得到任何强类型列表直接调用它就行了。你也许会说“我用的vs不支持yield return啊?”这种问题吧!那么使用vs2010来开发嘛!跟你的.net2.0平台没有关系,在vs下你就可以使用c#的新语法、可以使用yield return。
      

  7.   

    我从来没有用过 IList<T> 那种古老的过渡类型。要么使用直截了当的 List<T>,要么使用 IEnumerable<T> 接口。如果你不需要得到 IList<实体> 的话,也不一定要转换为这个类型。
      

  8.   

    转换?
    如果是LINQ,那么用OfType<T>和Cast<T>就好了。
    public static IEnumerable<TA> GetTA<TA>(IEnumerable<object> array)
    {
        return array.OfType<TA>();
    }