从DataTable到List<Model>(C#.net)

 

平时做业务设计的时候,总是离不了建立各种实体模型Model,但一般这些模型都需要从查询结果DataTable生成,

一般的写法是:为每一个模型编写一个方法,实现DataTable到Model的转换。

但这个方法有一些问题:

 (1)工作效率低:要为每个属性编写赋值语句,工作重复。

(2)代码重用性差:不同的类有不同的属性,这个Model转换不能够用于另一个Model的转换

(3)DataTable字段检测费力:每一次属性赋值都要写个判断,以确定这个Field字段是否存在,它的值是否是否合法,检测费力

解决:利用反射和泛型,写一个通用类,实现这个转换过程。(下面是网上找的代码,是正确的。这个方法我自己也写了,只是没别人写的规范,就拿别人的用用吧

View Code
 1 using System;
 2 using System.Collections.Generic; 
 3 using System.Text; 
 4 using System.Data; 
 5 using System.Reflection;   
 6 namespace NCL.Data 
 7 {     
 8     /// <summary>     
 9     /// 实体转换辅助类     
10     /// </summary>     
11     public class ModelConvertHelper<T> where  T : new()     
12     {        
13          public static IList<T> ConvertToModel(DataTable dt)
14          {            
15              // 定义集合             
16              IList<T> ts = new List<T>();
17              // 获得此模型的类型            
18              Type type = typeof(T); 
19              string tempName = "";             
20              foreach (DataRow dr in dt.Rows)        
21              {                
22              // 获得此模型的公共属性                
23                  PropertyInfo[] propertys = t.GetType().GetProperties();                  
24                  foreach (PropertyInfo pi in propertys)              
25                  {                     tempName = pi.Name;         
26                  // 检查DataTable是否包含此列                   
27                      if (dt.Columns.Contains(tempName))                 
28                      {                        
29                      // 判断此属性是否有Setter          
30                      if (!pi.CanWrite) continue;                   
31                      object value = dr[tempName];                    
32                      if (value != DBNull.Value)                        
33                      pi.SetValue(t, value, null);                
34                      }               
35                  }                
36                 ts.Add(t);      
37              }             
38             return ts;   
39          }   
40      } 
41  }  
42  
43  //示例:
44  // 获得查询结果 
45  DataTable dt = DbHelper.ExecuteDataTable(...); 
46  // 把DataTable转换为IList<UserInfo>
47  IList<UserInfo> users = ModelConvertHelper<UserInfo>.ConvertToModel(dt);

 

posted @ 2012-05-27 00:04  liwenqiang  阅读(414)  评论(0编辑  收藏  举报