/// <summary>
/// DataTable转List
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="dt"></param>
/// <returns></returns>
public List<T> ToList<T>(DataTable dt) where T : class, new()
{
List<T> list = new List<T>();
//确认参数有效,若无效则返回Null
if (dt == null)
return list;
else if (dt.Rows.Count == 0)
return list;
Dictionary<string, string> dicField = new Dictionary<string, string>();
Dictionary<string, string> dicProperty = new Dictionary<string, string>();
Type type = typeof(T);
//创建字段字典,方便查找字段名
foreach (var item in type.GetFields())
{
dicField.Add(item.Name.ToLower(), item.Name);
}
//创建属性字典,方便查找属性名
foreach (var item in type.GetProperties())
{
dicProperty.Add(item.Name.ToLower(), item.Name);
}
for (int i = 0; i < dt.Rows.Count; i++)
{
//创建泛型对象
T _t = Activator.CreateInstance<T>();
for (int j = 0; j < dt.Columns.Count; j++)
{
string memberKey = dt.Columns[j].ColumnName.ToLower();
//字段赋值
if (dicField.ContainsKey(memberKey))
{
FieldInfo theField = type.GetField(dicField[memberKey]);
var dbValue = dt.Rows[i][j];
if (dbValue.GetType() == typeof(DBNull))
dbValue = null;
if (dbValue != null)
{
Type memberType = theField.FieldType;
//dbValue = dbValue.ChangeType(memberType);
dbValue = Convert.ChangeType(dbValue, memberType);
}
theField.SetValue(_t, dbValue);
}
//属性赋值
if (dicProperty.ContainsKey(memberKey))
{
PropertyInfo theProperty = type.GetProperty(dicProperty[memberKey]);
if (!theProperty.CanWrite) continue;
var dbValue = dt.Rows[i][j];
if (dbValue.GetType() == typeof(DBNull))
dbValue = null;
if (dbValue != null)
{
Type memberType = theProperty.PropertyType;
if (memberType.IsGenericType && memberType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
{
NullableConverter newNullableConverter = new NullableConverter(memberType);
dbValue = newNullableConverter.ConvertFrom(dbValue);
}
else
{
dbValue = Convert.ChangeType(dbValue, memberType);
}
}
theProperty.SetValue(_t, dbValue, null);
}
}
list.Add(_t);
}
return list;
}
C# DataTable转List
最新推荐文章于 2024-05-17 11:15:25 发布