原文地址:http://www.cnblogs.com/fishtreeyu/archive/2011/03/11/1981068.html
把查询结果以DataTable 返回很方便,但是在检索数据时又很麻烦,没有模型类型 检索方便。
所以很多人都是按照以下方式做的:
// 获得查询结果
DataTable dt = DbHelper.ExecuteDataTable(...);
// 把DataTable转换为IList<UserInfo>
IList<UserInfo> users = ConvertToUserInfo(dt);
问题:如果此系统有几十上百个模型,那不是每个模型中都要写个把DataTable转换为此模型的方法吗?
解决:能不能写个通用类,可以把DataTable转换为任何模型,呵呵,这就需要利用反射和泛型 了
using System.Collections.Generic; |
public class ModelConvertHelper<T> where T : new () |
public static IList<T> ConvertToModel(DataTable dt) |
IList<T> ts = new List<T>(); |
foreach (DataRow dr in dt.Rows) |
PropertyInfo[] propertys = t.GetType().GetProperties(); |
foreach (PropertyInfo pi in propertys) |
if (dt.Columns.Contains(tempName)) |
if (!pi.CanWrite) continue ; |
object value = dr[tempName]; |
if (value != DBNull.Value) |
pi.SetValue(t, value, null ); |
使用方式:
// 获得查询结果
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代码:
List<Model.OrderItems> orderItemList = new DAl.OrderItemsDAO().GetListArray( "OrderId = '" + orderId + "' order by Id desc" ); |
repList.DataSource = orderItemList; |
前台.aspx代码:
<asp:Repeater ID= "repList" runat= "server" > |
<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> |
</asp:Repeater>