//D to L public static IList<T> ConvertTo<T>(DataTable table) { if (table == null) { return null; } List<DataRow> rows = new List<DataRow>(); foreach (DataRow row in table.Rows) { rows.Add(row); } return ConvertTo<T>(rows); } public static IList<T> ConvertTo<T>(IList<DataRow> rows) { IList<T> list = null; if (rows != null) { list = new List<T>(); foreach (DataRow row in rows) { T item = CreateItem<T>(row); list.Add(item); } } return list; } public static T CreateItem<T>(DataRow row) { T obj = default(T); if (row != null) { obj = Activator.CreateInstance<T>(); foreach (DataColumn column in row.Table.Columns) { PropertyInfo prop = obj.GetType().GetProperty(column.ColumnName); try { object value = row[column.ColumnName]; prop.SetValue(obj, value, null); } catch { //You can log something here //throw; } } } return obj; }
//方法2:
把查询结果以DataTable返回很方便,但是在检索数据时又很麻烦,没有模型类型检索方便。 所以很多人都是按照以下方式做的: // 获得查询结果 DataTable dt = DbHelper.ExecuteDataTable(...); // 把DataTable转换为IList<UserInfo> IList<UserInfo> users = ConvertToUserInfo(dt); 问题:如果此系统有几十上百个模型,那不是每个模型中都要写个把DataTable转换为此模型的方法吗? 解决:能不能写个通用类,可以把DataTable转换为任何模型,呵呵,这就需要利用反射和泛型了 view sourceprint?using System; using System.Collections.Generic; using System.Text; using System.Data; using System.Reflection; namespace NCL.Data { /// <summary> /// 实体转换辅助类 /// </summary> public class ModelConvertHelper<T> where T : new() { public static IList<T> ConvertToModel(DataTable dt) { // 定义集合 IList<T> ts = new List<T>(); // 获得此模型的类型 Type type = typeof(T); string tempName = ""; foreach (DataRow dr in dt.Rows) { T t = new T(); // 获得此模型的公共属性 PropertyInfo[] propertys = t.GetType().GetProperties(); foreach (PropertyInfo pi in propertys) { tempName = pi.Name; // 检查DataTable是否包含此列 if (dt.Columns.Contains(tempName)) { // 判断此属性是否有Setter if (!pi.CanWrite) continue; object value = dr[tempName]; if (value != DBNull.Value) pi.SetValue(t, value, null); } } ts.Add(t); } return ts; } } } 使用方式: // 获得查询结果 DataTable dt = DbHelper.ExecuteDataTable(...); // 把DataTable转换为IList<UserInfo> IList<UserInfo> users = ModelConvertHelper<UserInfo>.ConvertToModel(dt); Repeater绑定泛型List<T>比绑定DataTable效率更高,而且绑定List<T>可以实现智能感应提示: 这里举例在Repeater中绑定泛型List<T>的用法: 用<%#((Type)Container.DataItem).成员 %>可实现智能感应提示,而且比<%# Eval("成员")%>效率更高! 后台.cs代码: view sourceprint?List<Model.OrderItems> orderItemList = new DAl.OrderItemsDAO().GetListArray("OrderId = '" + orderId + "' order by Id desc"); repList.DataSource = orderItemList; repList.DataBind(); 前台.aspx代码: view sourceprint?<asp:Repeater ID="repList" runat="server"> <ItemTemplate> <tr> <td class="td02"><a href='productcon.aspx?id=<%#Eval("ProductId") %>' target="_blank"><%#Eval("ProductName") %></a></td> <td align="right" valign="middle" class="td02">¥<%#((Model.OrderItems)Container.DataItem).UnitPrice %></td> <td valign="middle" class="td02 colorgreg"><%#((Model.OrderItems)Container.DataItem).Quantity%></td> <td align="right" class="td02">¥<%#((Model.OrderItems)Container.DataItem).TotalPrice %></td> </tr> </ItemTemplate> </asp:Repeater>