把查询结果以DataTable返回很方便,但是在检索数据时又很麻烦,没有模型类型检索方便。

所以很多人都是按照以下方式做的:

// 获得查询结果
DataTable dt = DbHelper.ExecuteDataTable(...);
// 把DataTable转换为IList<UserInfo>
IList<UserInfo> users = ConvertToUserInfo(dt);

 问题:如果此系统有几十上百个模型,那不是每个模型中都要写个把DataTable转换为此模型的方法吗?
解决:能不能写个通用类,可以把DataTable转换为任何模型,呵呵,这就需要利用反射和泛型

  

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代码:

List<Model.OrderItems> orderItemList = new DAl.OrderItemsDAO().GetListArray("OrderId = '" + orderId + "' order by Id desc");
repList.DataSource = orderItemList;
repList.DataBind();

 

前台.aspx代码:

<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>  


 

posted on 2011-03-11 11:27  墟零  阅读(2894)  评论(4编辑  收藏  举报