public static IList<U> DataTableToEntityList<U>(U u, DataTable dt)
        {
            //sql返回的字段名集合
            Collection<string> columnNames = getColumnNames(dt);
            //需要组装的实体TYPE
            Type type = u.GetType();
            //结果
            IList<U> resultList = new List<U>();
            foreach (DataRow myRow in dt.Rows)
            {
                U y =u;//定义一个新对象赋值
                U outObj = GetOneObject(y, type, myRow, columnNames);
                //每次得到新的对象,用来赋值
                resultList.Add(y);
            }
            return resultList;
        }
  private static Y GetOneObject<Y>(Y tt,Type type, DataRow myRow, Collection<string> columnNames)
        {
            foreach (string cName in columnNames)
            {
                PropertyInfo pit = type.GetProperty(cName);
                pit.SetValue(tt, myRow[cName], null);
            }
            return tt;
        }
我是想用SQL查询返回的字段名去给实体对象赋值。columnNames 是sql返回的字段名。GetOneObject方法没一行记录传给一个对象。再把得到的对象放在一个list中。
现在问题是。columnNames 和sql返回的结果都正确,但resultList 中只能保存最后一行数据的值。比如:
sql返回 :
1 1
2 2
3 3list里面应该有 3个对象,没个对象值对应上面的值。但现在list中有3个对象,可2个对象都是 3,3 。
请高手帮忙看看...谢谢!!!

解决方案 »

  1.   

    U y =u;//定义一个新对象赋值
    哪里有新对象了?完全是同一个对象,lz对同一个对象修改了3次,然后加到list里面,所以list里面的3个元素都指向同一个对象
      

  2.   

    最简单的方法是对泛型做个约束:
    public static IList <U> DataTableToEntityList <U>(U u, DataTable dt) where U : new()
    约束U类型必须有默认构造函数
    这样,就可以在代码里面直接
    U y = new U()
      

  3.   

    传个方法进去,负责创建新的U对象:Func<U> constructor另外泛型的类型参数命名,很无语。