在考虑将表格数据导出成excel的时候,网上搜的时候找到一个特别合适的公共方法,可以将query查询出来的集合转换为datatable
需引用using System.Reflection;
1 public static DataTable LINQToDataTable<T>(IEnumerable<T> varlist) 2 { //定义要返回的DataTable对象 3 DataTable dtReturn = new DataTable(); 4 // 保存列集合的属性信息数组 5 PropertyInfo[] oProps = null; 6 if (varlist == null) return dtReturn;//安全性检查 7 //循环遍历集合,使用反射获取类型的属性信息 8 foreach (T rec in varlist) 9 { 10 //使用反射获取T类型的属性信息,返回一个PropertyInfo类型的集合 11 if (oProps == null) 12 { 13 oProps = ((Type)rec.GetType()).GetProperties(); 14 //循环PropertyInfo数组 15 foreach (PropertyInfo pi in oProps) 16 { 17 Type colType = pi.PropertyType;//得到属性的类型 18 //如果属性为泛型类型 19 if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition() 20 == typeof(Nullable<>))) 21 { //获取泛型类型的参数 22 colType = colType.GetGenericArguments()[0]; 23 } 24 //将类型的属性名称与属性类型作为DataTable的列数据 25 dtReturn.Columns.Add(new DataColumn(pi.Name, colType)); 26 } 27 } 28 //新建一个用于添加到DataTable中的DataRow对象 29 DataRow dr = dtReturn.NewRow(); 30 //循环遍历属性集合 31 foreach (PropertyInfo pi in oProps) 32 { //为DataRow中的指定列赋值 33 dr[pi.Name] = pi.GetValue(rec, null) == null ? 34 DBNull.Value : pi.GetValue(rec, null); 35 } 36 //将具有结果值的DataRow添加到DataTable集合中 37 dtReturn.Rows.Add(dr); 38 } 39 return dtReturn;//返回DataTable对象 40 }
转载地址:http://www.cnblogs.com/yangtongnet/archive/2010/07/06/1772314.html