DataTable在一些后台操作上不是很便利,所以可以将数据集转换成List在进行操作。
简单直接的方法就是循环datatable一一对应赋值给类,然后附加到List中。但是遇到属性过多的时候就麻烦不少。
查了下资料,发现可以使用反射和泛型来实现。
public static IList<QD_DOC_PUR> ConvertToList(DataTable dt)
{
var docPurList = new List<QD_DOC_PUR>();
var docPurSql = "select * from QD_DOC_PUR ";
var docPurDT = Services.SqlHelper.FillDataSet(docPurSql, CommandType.Text).Tables[0];
foreach (DataRow dr in docPurDT.Rows)
{
QD_DOC_PUR docPurEntity = new QD_DOC_PUR();
string tempName = string.Empty;
PropertyInfo[] propertys = docPurEntity.GetType().GetProperties();
foreach (PropertyInfo pi in propertys)
{
tempName = pi.Name;
if (docPurDT.Columns.Contains(tempName))
{
Type type = pi.PropertyType;
object value = dr[tempName];
if (value != DBNull.Value)
pi.SetValue(docPurEntity, Convert.ChangeType(value, type), null);
}
}
docPurList.Add(docPurEntity);
}
return docPurList;
}
以上的代码在遇到属性可空时会报错:
从“System.String”到“System.Nullable`1[[System.Decimal, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]”的强制转换无效。
需要对Type进行可空的转换
Type type = pi.PropertyType;
if (type.IsGenericType && type.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))//判断convertsionType是否为nullable泛型类
{
//如果type为nullable类,声明一个NullableConverter类,该类提供从Nullable类到基础基元类型的转换
System.ComponentModel.NullableConverter nullableConverter = new System.ComponentModel.NullableConverter(type);
//将type转换为nullable对的基础基元类型
type = nullableConverter.UnderlyingType;
}
public static IList<QD_DOC_PUR> ConvertToList(DataTable dt)
{
var docPurList = new List<QD_DOC_PUR>();
var docPurSql = "select * from QD_DOC_PUR ";
var docPurDT = Services.SqlHelper.FillDataSet(docPurSql, CommandType.Text).Tables[0];
foreach (DataRow dr in docPurDT.Rows)
{
QD_DOC_PUR docPurEntity = new QD_DOC_PUR();
string tempName = string.Empty;
PropertyInfo[] propertys = docPurEntity.GetType().GetProperties();
foreach (PropertyInfo pi in propertys)
{
tempName = pi.Name;
if (docPurDT.Columns.Contains(tempName))
{
Type type = pi.PropertyType;
if (type.IsGenericType && type.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))//判断convertsionType是否为nullable泛型类
{
//如果type为nullable类,声明一个NullableConverter类,该类提供从Nullable类到基础基元类型的转换
System.ComponentModel.NullableConverter nullableConverter = new System.ComponentModel.NullableConverter(type);
//将type转换为nullable对的基础基元类型
type = nullableConverter.UnderlyingType;
}
object value = dr[tempName];
if (value != DBNull.Value)
pi.SetValue(docPurEntity, Convert.ChangeType(value, type), null);
}
}
docPurList.Add(docPurEntity);
}
return docPurList;
}