using System; using System.Collections; using System.Collections.Generic; using System.Data; using System.Linq; using System.Reflection; namespace DPumpHydr.WinFrmUI.WenSkin.DLL { public static class DataTableList { public static List ConvertToModel(this DataTable dt) where T : new() { // 定义集合 List ts = new List(); foreach (DataRow dr in dt.Rows) { T t = new T(); // 获得此模型的公共属性 PropertyInfo[] propertys = t.GetType().GetProperties(); foreach (PropertyInfo pi in propertys) { string tempName = pi.Name; if (dt.Columns.Contains(tempName)) { // 判断此属性是否有Setter if (!pi.CanWrite) continue; object value = dr[tempName]; if (value != DBNull.Value) { pi.SetValue(t, ConvertTo(value, pi.PropertyType), null); } } } ts.Add(t); } return ts; } private static object ConvertTo(object convertibleValue, Type type) { if (!type.IsGenericType) { return Convert.ChangeType(convertibleValue, type); } else { Type genericTypeDefinition = type.GetGenericTypeDefinition(); if (genericTypeDefinition == typeof(Nullable<>)) { return Convert.ChangeType(convertibleValue, Nullable.GetUnderlyingType(type)); } } throw new InvalidCastException(string.Format("Invalid cast from type \"{0}\" to type \"{1}\".", convertibleValue.GetType().FullName, type.FullName)); } /// /// list to datatable /// /// /// /// public static DataTable ToDataTable(this IEnumerable collection) { var props = typeof(T).GetProperties(); var dt = new DataTable(); var columns = props.Select(p => { var t = p.PropertyType; if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>)) { t = t.GetGenericArguments()[0]; } return new DataColumn(p.Name, t); }).ToArray(); dt.Columns.AddRange(columns); if (collection.Count() > 0) { for (int i = 0; i < collection.Count(); i++) { ArrayList tempList = new ArrayList(); foreach (PropertyInfo pi in props) { object obj = pi.GetValue(collection.ElementAt(i), null); tempList.Add(obj); } object[] array = tempList.ToArray(); dt.LoadDataRow(array, true); } } return dt; } /// /// list to datatable 格式转换为string类 /// /// /// /// public static DataTable ToDataTableType(this IEnumerable collection) { var props = typeof(T).GetProperties(); var dt = new DataTable(); dt.Columns.AddRange(props.Select(p => new DataColumn(p.Name)).ToArray()); if (collection.Count() > 0) { for (int i = 0; i < collection.Count(); i++) { ArrayList tempList = new ArrayList(); foreach (PropertyInfo pi in props) { object obj = pi.GetValue(collection.ElementAt(i), null); tempList.Add(obj); } object[] array = tempList.ToArray(); dt.LoadDataRow(array, true); } } return dt; } } }