笨鸟有个问题想请教大虾们,我现在有一个DataTable,想写一个通用的方法,把它转成List<T>这样的类型,但这个类型T可能是对象A、B或C,那么我这样能不能写成一个通用的方法,就是当传进来的类型是A时,就转换为List<A>这样一个集合返回,当是B时,就返回List<B>,以此类推......,当然,当类型不同时,DataTable中的数据内容肯定也不一样啦,还是说没有通用的方法,必须每个类型写一个方法呢,各位大虾,请给小弟给给建议吧,谢谢啦!!

解决方案 »

  1.   

    利用DataTable 返回一个 LIST<T>倒是可以把,但是在这个方法里面自己就判断是A、B、C对象貌似不太现实吧?
    泛型我也不熟悉,顺便来学习下~~~
      

  2.   

    语法类似于
            List<T> MethodA<T>(T value)
            {
                return new List<T>();
            }但是就是不太清楚你说的DataTable包含的数据类型是什么意思哈
      

  3.   

    在方法里用case when来判断T的类型?
    List<Object T>
    case when T is string then return List<string>
    else when T is int then return List<int>
    ......乱写的伪代码,就是这个意思,可以考虑下。。
      

  4.   

    基本上类似这样:IEnumerable<User> results = dt.AsEnumerable().Select(r => new User { LogName = r.Field<string>("Name"), EMail = r.Field<string>("email") });
    当然你进行ToList计算也行。但是往往这没有必要付出生成一个新的集合的空间。当使用foreach来遍历results集合时,就是以迭代器方式去直接访问dt的。
      

  5.   

    用不着自己些什么“通用方法”了,在 System.Data.DataSetExtensions.dll 中的这些对DataTable和DataSet的扩展方法,帮助你以非常简练的的Linq语法代码来迭代使用它们。
      

  6.   


    //反射实现public static List<T> toList<T>(this DataTable table)
            {
                List<T> list = new List<T>();            T item;
                Type listItemType = typeof(T);            for (int i = 0; i < table.Rows.Count; i++)
                {
                    item = (T)Activator.CreateInstance(listItemType);
                    mapRow(item, table, listItemType, i);
                    list.Add(item);
                }
                return list;
            }
            private static void mapRow(object vOb, System.Data.DataTable table, Type type, int row)
            {
                for (int col = 0; col < table.Columns.Count; col++)
                {
                    var columnName = table.Columns[col].ColumnName;                var prop = type.GetProperty(columnName);
                    object data = getData(prop, table.Rows[row][col]);
                    prop.SetValue(vOb, data, null);            }
            }        private static object getData(PropertyInfo prop, object value)
            {
                if (prop.PropertyType.Name.Equals("Int32"))
                    return Convert.ToInt32(value);            if (prop.PropertyType.Name.Equals("Double"))
                    return Convert.ToDouble(value);            if (prop.PropertyType.Name.Equals("DateTime"))
                    return Convert.ToDateTime(value);            return Convert.ToString(value).Trim();
            }