List和DataTable相互转换

转载:http://www.okbase.net/doc/details/3282

一、List/IEnumerable转换到DataTable/DataView方法一:/// 
/// Convert a List{T} to a DataTable.
/// 
private DataTable ToDataTable(List items)
{var tb = new DataTable(typeof (T).Name);PropertyInfo[] props = typeof (T).GetProperties(BindingFlags.Public | BindingFlags.Instance);foreach (PropertyInfo prop in props){Type t = GetCoreType(prop.PropertyType);tb.Columns.Add(prop.Name, t);}foreach (T item in items){var values = new object[props.Length];for (int i = 0; i < props.Length; i++){values[i] = props[i].GetValue(item, null);}tb.Rows.Add(values);}return tb;
}/// 
/// Determine of specified type is nullable
/// 
public static bool IsNullable(Type t)
{return !t.IsValueType || (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>));
}/// 
/// Return underlying type if type is Nullable otherwise return the type
/// 
public static Type GetCoreType(Type t)
{if (t != null && IsNullable(t)){if (!t.IsValueType){return t;}else{return Nullable.GetUnderlyingType(t);}}else{return t;}
}方法二:public static DataTable ToDataTable(IEnumerable collection){var props = typeof(T).GetProperties();var dt = new DataTable();dt.Columns.AddRange(props.Select(p => new DataColumn(p.Name, p.PropertyType)).ToArray());if (collection.Count() > 0){for (int i = 0; i < collection.Count(); i++){ArrayList tempList = new ArrayList();foreach (PropertyInfo pi in props){object obj = pi.GetValue(collection.ElementAt(i), null);tempList.Add(obj);}object[] array = tempList.ToArray();dt.LoadDataRow(array, true);}}return dt;}二、DataTable转换到List方法一:public static IList ConvertTo(DataTable table)  
{  if (table == null)  {  return null;  }  List rows = new List();  foreach (DataRow row in table.Rows)  {  rows.Add(row);  }  return ConvertTo(rows);  
}  public static IList ConvertTo(IList rows)  
{  IList list = null;  if (rows != null)  {  list = new List();  foreach (DataRow row in rows)  {  T item = CreateItem(row);  list.Add(item);  }  }  return list;
}    public static T CreateItem(DataRow row)    
{T obj = default(T);    if (row != null)    {    obj = Activator.CreateInstance();    foreach (DataColumn column in row.Table.Columns)    {    PropertyInfo prop = obj.GetType().GetProperty(column.ColumnName);    try    {    object value = row[column.ColumnName];    prop.SetValue(obj, value, null);    }    catch    {  //You can log something here     //throw;    }    }    }    return obj;    
}方法二:把查询结果以DataTable返回很方便,但是在检索数据时又很麻烦,没有模型类型检索方便。   
所以很多人都是按照以下方式做的:  
// 获得查询结果  
DataTable dt = DbHelper.ExecuteDataTable(...);  
// 把DataTable转换为IList  
IList users = ConvertToUserInfo(dt);  问题:如果此系统有几十上百个模型,那不是每个模型中都要写个把DataTable转换为此模型的方法吗?  
解决:能不能写个通用类,可以把DataTable转换为任何模型,呵呵,这就需要利用反射和泛型了  using System;      
using System.Collections.Generic;  
using System.Text;    
using System.Data;    
using System.Reflection;  
namespace NCL.Data    
{    ///     /// 实体转换辅助类    ///     public class ModelConvertHelper where   T : new()    {    public static IList ConvertToModel(DataTable dt)    {    // 定义集合    IList ts = new List(); // 获得此模型的类型   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  
IList users = ModelConvertHelper.ConvertToModel(dt);


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部