欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

List泛型与DataTable相互转换

程序员文章站 2023-03-28 08:15:38
public static class ExtensionMethods{/// /// 将List转换成DataTable/// /// ///

public static class extensionmethods
{
/// <summary>
/// 将list转换成datatable
/// </summary>
/// <typeparam name="t"></typeparam>
/// <param name="data"></param>
/// <returns></returns>
public static datatable todatatable<t>(this ilist<t> data)
{
propertydescriptorcollection properties = typedescriptor.getproperties(typeof(t));
datatable dt = new datatable();
for (int i = 0; i < properties.count; i++)
{
propertydescriptor property = properties[i];
dt.columns.add(property.name, property.propertytype);
}
object[] values = new object[properties.count];
foreach (t item in data)
{
for (int i = 0; i < values.length; i++)
{
values[i] = properties[i].getvalue(item);
}
dt.rows.add(values);
}
return dt;
}

/// <summary>
/// datatable转泛型
/// </summary>
/// <typeparam name="t"></typeparam>
/// <param name="dt">datatable</param>
/// <returns></returns>
public static list<t> tolist<t>(this datatable dt) where t : class, new()
{
//获取类
type t = typeof(t);
//反射 using system.reflection;
//获取当前type的公共属性
propertyinfo[] propertys = t.getproperties();
list<t> list = new list<t>();
//字段名称
string typename = string.empty;
//遍历datatable每行
foreach (datarow dr in dt.rows)
{
//创建实体
t entity = new t();
//遍历实体的公共属性
foreach (propertyinfo pi in propertys)
{
//将字段名称赋值
typename = pi.name;
if (dt.columns.contains(typename))
{
//获取一个值,该值指定此属性是否可写 set 
if (!pi.canwrite) continue;
//根据字段名称获取对应值
object value = dr[typename];
//若不存在 则跳出
if (value == dbnull.value) continue;
//获取此属性的类型是否是string类型
if (pi.propertytype == typeof(string))
{
//propertyinfo.setvalue()三个参数
//第一个 将设置其属性值的对象。
//第二个 新的属性值。
//第三个 索引化属性的可选索引值。 对于非索引化属性,该值应为 null。
pi.setvalue(entity, value.tostring(), null);
}
else if (pi.propertytype == typeof(int))
{
//写入
pi.setvalue(entity, int.parse(value.tostring()), null);
}
else if (pi.propertytype == typeof(datetime))
{
//写入
pi.setvalue(entity, datetime.parse(value.tostring()), null);
}
else
{
pi.setvalue(entity, value, null);
}
}
}
//加入泛型末尾
list.add(entity);
}
return list;
}
}