DataTable转换为List的通用类(绑定Repeater智能提示)

把查询结果以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>  


 

你可能感兴趣的:(Datatable)