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;
}
}
上一篇: 微信给抖音"亮红牌" 是垄断还是不正当竞争引发争议
下一篇: 你说这年头,挣个钱容易么