1. 程式人生 > >C#DataTable轉list

C#DataTable轉list

    把查詢結果以Datatable返回很方便,但是在檢索資料時又很麻煩,沒有模型型別檢索方便。

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

//獲得查詢結果
Datatable dt=sqlhelper.ExecuteQuery(...);
//把Datatable轉換為List<UserInfo>
List<UserInfo> users=ConvertToUserInfo(dt);
    問題:如果系統中有幾十個上百個模型,那不是每個模型中都要寫個DataTable轉換為此模型的方法嗎?

解決,能不能寫個通用類,可以把DataTable轉換為任何模型,這就要用到反射和泛型了。

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Reflection;
namespace DAL   
{    
    /// <summary>    
    /// 實體轉換輔助類    
    /// </summary>    
    public class DatatableToList   
     {    
        public static List<T> ConvertToList<T>(DataTable dt)where T:new()   
         {    
            // 定義集合    
             List<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 = sqlhelper.ExecuteQuery(...);  
// 把DataTable轉換為List<UserInfo>  
return DatatableToList.ConvertToList<UserInfo>(dt);