反射实例-DataTable 转 List
1.新建一个控制台程序
2.在控制台程序新建一个Student.cs 实体类
public class Student
{
public int ID { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public DateTime? AddTime { get; set; }
}
3.新建一个静态类(ExtendClass.cs),用于实现数据转换
public static class ExtendClass
{
public static List<T> ToModel<T>(this DataTable dt)
{
List<T> list = new List<T>();
foreach (DataRow dr in dt.Rows)
{
T t = Activator.CreateInstance<T>();
var properties = t.GetType().GetProperties();
foreach (var property in properties)
{
//判断列是否存在
if (dt.Columns.Contains(property.Name))
{
var value = dr[property.Name];
try
{
//判断value是否为null
if (!Convert.IsDBNull(value))
{
//用于判断属性是否可谓null,如:public DateTime? AddTime { get; set; }
if (property.PropertyType.ToString().Contains("System.Nullable`1"))
{
property.SetValue(t, Convert.ChangeType(value, Nullable.GetUnderlyingType(property.PropertyType)), null);
}
else
{
property.SetValue(t, Convert.ChangeType(value, property.PropertyType), null);
}
}
}
catch (Exception e)
{
throw new Exception($"属性名称:{property.Name} 转换类型出错,值为:{value}");
}
}
}
list.Add(t);
}
return list;
}
}
4.在控制台调用方法
static void Main(string[] args)
{
DataTable dt = new DataTable();
//新增列
dt.Columns.Add("ID");
dt.Columns.Add("Name");
dt.Columns.Add("Age");
dt.Columns.Add("AddTime");
for (int i = 0; i < 10; i++)
{
DataRow dr = dt.NewRow();
dr["ID"] = i;
dr["Name"] = "张三" + i;
dr["Age"] = 18 + i;
dr["AddTime"] = (i % 2 == 0) ? dr["AddTime"] = DateTime.Now.AddDays(i) : dr["AddTime"] = null;
dt.Rows.Add(dr);
}
var students = dt.ToModel<Student>();
}
将来的你,一定会感谢现在努力的自己!