长治做网站公司,哪里建设企业网站,新冠新增病例最新消息,网站开发的技术问题背景介绍
C#中实体类的操作十分简便#xff0c;一般情况下不需要涉及ADO.NET#xff0c;如果需要将实体类转化为Datatable#xff0c;这个时候就需要手动写一个方法了#xff0c;代码如下图所示#xff1a; public static class IEnumerableExtention{/// summary一般情况下不需要涉及ADO.NET如果需要将实体类转化为Datatable这个时候就需要手动写一个方法了代码如下图所示 public static class IEnumerableExtention{/// summary/// 将实体类转化为Datatable/// /summary/// typeparam nameT实体类类型/typeparam/// param name_ienu实体对象/param/// param name_tableName表名/param/// returns转化成的DataTable/returnspublic static DataTable ToDataTableT(this IEnumerableT _ienu, string _tableName tableFromList) where T : new(){DataTable resultTable new DataTable(_tableName);var pi typeof(T).GetProperties(BindingFlags.Public|BindingFlags.Instance|BindingFlags.DeclaredOnly).ToList();if (_ienu null || pi null || pi.Count 0){//当实体类为空的时候返回空的DataTable}else{pi.ForEach(p { resultTable.Columns.Add(p.Name, p.PropertyType); });//生成Datatable列及列属性foreach (var _ie in _ienu){var dr resultTable.NewRow();foreach (var prop in pi){if (prop.GetMethod ! null){dr.SetField(prop.Name, prop.GetValue(_ie));}}resultTable.Rows.Add(dr);}}return resultTable;}/// summary/// 将实体类转化为DataSet/// /summary/// typeparam nameT实体类类型/typeparam/// param name_ienu实体对象/param/// param name_tableName表名/param/// returns转化成的DataSet/returnspublic static DataSet ToDataSetT(this IEnumerableT _ienu, string _tableName tableFromList) where T : new(){DataSet ds new DataSet();ds.Tables.Add(_ienu.ToDataTable(_tableName));return ds;}/// summary/// 将实体类的对象列表复制给另一个类型相同的实体类/// /summary/// typeparam nameT源实体类对象类型/typeparam/// param name_ienu源实体类/param/// returns返回的实体类/returnspublic static IEnumerableT CopyT(this IEnumerableT _ienu) where T : new(){var resultLists new ListT();var pi typeof(T).GetProperties(BindingFlags.Instance|BindingFlags.Public|BindingFlags.DeclaredOnly).ToList();if (null _ienu || null pi || pi.Count 0){//源实体类对象为空则返回空实体类}else{foreach (var _ie in _ienu){var resultList new T();foreach (var prop in pi){if (prop.SetMethod ! null prop.GetMethod ! null !prop.PropertyType.IsAbstract){prop.SetValue(resultList,prop.GetValue(_ie));}}resultLists.Add(resultList);}}return resultLists;}/// summary/// 将一个实体类对象列表复制给另一个类型相同的实体类支持筛选/// /summary/// typeparam nameT源实体类对象类型/typeparam/// param name_ienu源实体类/param/// param name_predicate筛选的委托/param/// returns/returnspublic static IEnumerableT CopyT(this IEnumerableT _ienu, FuncT, bool _predicate null) where T:new(){var resultLists new ListT();var pi typeof(T).GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly).ToList();if (null _ienu || null pi || pi.Count 0){//源实体类对象为空则返回空实体类}else{if (_predicate ! null){_ienu _ienu.Where(_predicate);}else{foreach (var _ie in _ienu){var resultList new T();foreach (var prop in pi){if (prop.SetMethod ! null prop.GetMethod ! null !prop.PropertyType.IsAbstract){prop.SetValue(resultList, prop.GetValue(_ie));}}resultLists.Add(resultList);}}}return resultLists;}/// summary/// 将一个实体类对象列表复制给另一个类型不相同的实体类,支持筛选只复制名称和类型都相同的属性/// /summary/// typeparam nameTSource源实体类类型/typeparam/// typeparam nameTResult目标实体类类型/typeparam/// param name_ienu源实体类/param/// param name_predicate筛选的委托/param/// returns返回的实体类/returnspublic static ListTResult CopyToTSource, TResult(this IEnumerableTSource _ienu, FuncTSource, bool _predicate null) where TResult : new(){var resultLists new ListTResult();if (_ienu null){throw new ArgumentNullException(nameof(_ienu));}var piSource typeof(TSource).GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly).ToList();//获取来源实体类属性var piResult typeof(TResult).GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly).ToList();//获取返回实体类属性if (piSource null || piSource.Count 0 || piResult null || piResult.Count 0){//返回空实体类return resultLists;}if (null ! _predicate){_ienu _ienu.Where(_predicate);}if (_ienu.Count() 0)//判断来源实体类中列表数量{ListTuplePropertyInfo, bool PropLists new ListTuplePropertyInfo, bool();piResult.ForEach(p {if (piSource.Exists(q q.Name.Equals(p.Name))){PropLists.Add(Tuple.Create(p, p.PropertyType.Equals(piResult.FirstOrDefault(q q.Name.Equals(p.Name)).PropertyType)));}});foreach (var _ie in _ienu){var resultList new TResult();var samePropLists PropLists.Where(p p.Item2 true).ToList();//提取类型也相同的属性foreach (var prop in samePropLists){if (prop.Item1.GetMethod ! null _ie.GetType().GetProperty(prop.Item1.Name).SetMethod ! null){var value piSource.FirstOrDefault(p p.Name.Equals(prop.Item1.Name)).GetValue(_ie);prop.Item1.SetValue(resultList, value);}}resultLists.Add(resultList);}}return resultLists;}}
IEnumerableExtention类中包含五个方法第一个直接将实体类转化为Datatable第二个是在第一个的基础上包了一层DataSet并返回。第三个和第四个是将实体类列表复制给类型相同的另一个实体类第四个支持筛选。第五个是将实体类复制给类型不相同的实体类但是只支持复制类型和名字都相同的属性。