本案例提供了:把DataRow转换为单个实体、dataTable转换为List泛型支持时间格式转换。
下文的方法都是扩展方法。扩展方法要求写在静态类中,方法也要静态。
- 它必须在一个非嵌套、非泛型的静态类中
- 它至少要有一个参数
- 第一个参数必须加上this关键字作为前缀(第一个参数类型也称为扩展类型,即指方法对这个类型进行扩展)
- 第一个参数不能用其他任何修饰符(如不能使用ref out等修饰符)
- 第一个参数的类型不能是指针类型
1.将DataRow转换为实体
/// <summary> /// DataRow扩展方法:将DataRow类型转化为指定类型的实体 /// </summary> /// <typeparam name="T">实体类型</typeparam> /// <returns></returns> public static T ToModel<T>(this DataRow dr) where T : class,new() { return ToModel<T>(dr,true); }
2.将DataRow转换为实体可设置时间格式转换
/// <summary> /// DataRow扩展方法:将DataRow类型转化为指定类型的实体 /// </summary> /// <typeparam name="T">实体类型</typeparam> /// <param name="dateTimeToString">是否需要将日期转换为字符串,默认为转换,值为true</param> /// <returns></returns> /// <summary> public static T ToModel<T>(this DataRow dr, bool dateTimeToString) where T : class, new() { if (dr != null) return ToList<T>(dr.Table, dateTimeToString).First(); return null; }
3.将DataTable转换为实体
/// <summary> /// DataTable扩展方法:将DataTable类型转化为指定类型的实体集合 /// </summary> /// <typeparam name="T">实体类型</typeparam> /// <param name="dateTimeToString">是否需要将日期转换为字符串,默认为转换,值为true</param> /// <returns></returns> public static List<T> ToList<T>(this DataTable dt, bool dateTimeToString) where T : class, new() { List<T> list = new List<T>(); if (dt != null) { List<PropertyInfo> infos = new List<PropertyInfo>(); Array.ForEach<PropertyInfo>(typeof(T).GetProperties(), p => { if (dt.Columns.Contains(p.Name) == true) { infos.Add(p); } });//获取类型的属性集合 SetList<T>(list, infos, dt, dateTimeToString); } return list; }
4.转换实现代码
private static void SetList<T>(List<T> list, List<PropertyInfo> infos, DataTable dt, bool dateTimeToString) where T : class, new() { foreach (DataRow dr in dt.Rows) { T model = new T(); infos.ForEach(p => { if (dr[p.Name] != DBNull.Value)//判断属性在不为空 { object tempValue = dr[p.Name]; if (dr[p.Name].GetType() == typeof(DateTime) && dateTimeToString == true)//判断是否为时间 { tempValue = dr[p.Name].ToString(); } try { p.SetValue(model, tempValue, null);//设置 } catch { } } }); list.Add(model); }//结束循环 }
本文属于转载,感谢原作者的辛勤劳动