1、创建DataTable扩展方法类(DataTableExtend.cs)
using System;
using System.Collections.Generic;
using System.Data;
using System.Reflection;
namespace MyTest.OA.Common
{
///
/// DataTable扩展方法类
///
public static class DataTableExtend
{
///
/// DataTable转成List
///
public static List ToDataList(this DataTable dt)
{
var list = new List();
var plist = new List(typeof(T).GetProperties());
if (dt == null || dt.Rows.Count == 0)
{
return null;
}
foreach (DataRow item in dt.Rows)
{
T s = Activator.CreateInstance();
for (int i = 0; i < dt.Columns.Count; i++)
{
PropertyInfo info = plist.Find(p => p.Name == dt.Columns[i].ColumnName);
if (info != null)
{
try
{
if (!Convert.IsDBNull(item[i]))
{
object v = null;
if (info.PropertyType.ToString().Contains("System.Nullable"))
{
v = Convert.ChangeType(item[i], Nullable.GetUnderlyingType(info.PropertyType));
}
else
{
v = Convert.ChangeType(item[i], info.PropertyType);
}
info.SetValue(s, v, null);
}
}
catch (Exception ex)
{
throw new Exception("字段[" + info.Name + "]转换出错," + ex.Message);
}
}
}
list.Add(s);
}
return list;
}
///
/// DataTable转成实体对象
///
///
///
///
public static T ToDataEntity(this DataTable dt)
{
T s = Activator.CreateInstance();
if (dt == null || dt.Rows.Count == 0)
{
return default(T);
}
var plist = new List(typeof(T).GetProperties());
for (int i = 0; i < dt.Columns.Count; i++)
{
PropertyInfo info = plist.Find(p => p.Name == dt.Columns[i].ColumnName);
if (info != null)
{
try
{
if (!Convert.IsDBNull(dt.Rows[0][i]))
{
object v = null;
if (info.PropertyType.ToString().Contains("System.Nullable"))
{
v = Convert.ChangeType(dt.Rows[0][i], Nullable.GetUnderlyingType(info.PropertyType));
}
else
{
v = Convert.ChangeType(dt.Rows[0][i], info.PropertyType);
}
info.SetValue(s, v, null);
}
}
catch (Exception ex)
{
throw new Exception("字段[" + info.Name + "]转换出错," + ex.Message);
}
}
}
return s;
}
///
/// List转成DataTable
///
/// 实体类型
/// 实体集合
public static DataTable ToDataTable(List entities)
{
if (entities == null || entities.Count == 0)
{
return null;
}
var result = CreateTable();
FillData(result, entities);
return result;
}
///
/// 创建表
///
private static DataTable CreateTable()
{
var result = new DataTable();
var type = typeof(T);
foreach (var property in type.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance))
{
var propertyType = property.PropertyType;
if ((propertyType.IsGenericType) && (propertyType.GetGenericTypeDefinition() == typeof(Nullable<>)))
propertyType = propertyType.GetGenericArguments()[0];
result.Columns.Add(property.Name, propertyType);
}
return result;
}
///
/// 填充数据
///
private static void FillData(DataTable dt, IEnumerable entities)
{
foreach (var entity in entities)
{
dt.Rows.Add(CreateRow(dt, entity));
}
}
///
/// 创建行
///
private static DataRow CreateRow(DataTable dt, T entity)
{
DataRow row = dt.NewRow();
var type = typeof(T);
foreach (var property in type.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance))
{
row[property.Name] = property.GetValue(entity) ?? DBNull.Value;
}
return row;
}
}
}
2、其它代码
2.1 创建用户信息类(UserInfo.cs)
///
/// 用户信息类
///
public class UserInfo
{
///
/// 编号
///
public int ID { get; set; }
///
/// 名称
///
public string Name { get; set; }
///
/// 年龄
///
public int Age { get; set; }
///
/// 成绩
///
public double Score { get; set; }
///
/// 创建时间
///
public DateTime? CreateTime { get; set; }
}
2.2 创建DataTable对象的方法
///
/// 创建DataTable对象
///
public static DataTable CreateDataTable()
{
//创建DataTable
DataTable dt = new DataTable("NewDt");
//创建自增长的ID列
DataColumn dc = dt.Columns.Add("ID", Type.GetType("System.Int32"));
dc.AutoIncrement = true; //自动增加
dc.AutoIncrementSeed = 1; //起始为1
dc.AutoIncrementStep = 1; //步长为1
dc.AllowDBNull = false; //非空
//创建其它列表
dt.Columns.Add(new DataColumn("Name", Type.GetType("System.String")));
dt.Columns.Add(new DataColumn("Age", Type.GetType("System.Int32")));
dt.Columns.Add(new DataColumn("Score", Type.GetType("System.Decimal")));
dt.Columns.Add(new DataColumn("CreateTime", Type.GetType("System.DateTime")));
//创建数据
DataRow dr = dt.NewRow();
dr["Name"] = "张三";
dr["Age"] = 28;
dr["Score"] = 85.5;
dr["CreateTime"] = DateTime.Now;
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["Name"] = "李四";
dr["Age"] = 24;
dr["Score"] = 72;
dr["CreateTime"] = DateTime.Now;
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["Name"] = "王五";
dr["Age"] = 36;
dr["Score"] = 63.5;
dr["CreateTime"] = DateTime.Now;
dt.Rows.Add(dr);
return dt;
}
3、测试
3.1 添加引用:
using MyTest.OA.Common;
3.2 测试方法:
//创建一个DataTable对象
DataTable dt = CreateDataTable();
//1、DataTable转成List
List userList = dt.ToDataList();
//2、DataTable转成实体对象
UserInfo user = dt.ToDataEntity();
//3、List转成DataTable
DataTable dt2 = DataTableExtend.ToDataTable(userList);