public static DataTableEntityBuilder <Entity> CreateBuilder(DataRow dataRecord) { DataTableEntityBuilder <Entity> dynamicBuilder = new DataTableEntityBuilder <Entity>(); DynamicMethod method = new DynamicMethod("DynamicCreateEntity", typeof(Entity), new Type[] { typeof(DataRow) }, typeof(Entity), true); ILGenerator generator = method.GetILGenerator(); LocalBuilder result = generator.DeclareLocal(typeof(Entity)); generator.Emit(OpCodes.Newobj, typeof(Entity).GetConstructor(Type.EmptyTypes)); generator.Emit(OpCodes.Stloc, result); for (int i = 0; i < dataRecord.ItemArray.Length; i++) { PropertyInfo propertyInfo = typeof(Entity).GetProperty(dataRecord.Table.Columns[i].ColumnName); Label endIfLabel = generator.DefineLabel(); if (propertyInfo != null && propertyInfo.GetSetMethod() != null) { generator.Emit(OpCodes.Ldarg_0); generator.Emit(OpCodes.Ldc_I4, i); generator.Emit(OpCodes.Callvirt, isDBNullMethod); generator.Emit(OpCodes.Brtrue, endIfLabel); generator.Emit(OpCodes.Ldloc, result); generator.Emit(OpCodes.Ldarg_0); generator.Emit(OpCodes.Ldc_I4, i); generator.Emit(OpCodes.Callvirt, getValueMethod); generator.Emit(OpCodes.Unbox_Any, propertyInfo.PropertyType); generator.Emit(OpCodes.Callvirt, propertyInfo.GetSetMethod()); generator.MarkLabel(endIfLabel); } } generator.Emit(OpCodes.Ldloc, result); generator.Emit(OpCodes.Ret); dynamicBuilder.handler = (Load)method.CreateDelegate(typeof(Load)); return(dynamicBuilder); }
/// <summary> /// DataTable 转换为List 集合 /// </summary> /// <typeparam name="TResult">类型</typeparam> /// <param name="dt">DataTable</param> /// <returns></returns> //public static List<TResult> ToList<TResult>(this DataTable dt) where TResult : class, new() //{ //#region 第一种方法 ////第一种方法 ////创建一个属性的列表 //List<PropertyInfo> prlist = new List<PropertyInfo>(); ////获取TResult的类型实例 反射的入口 //Type t = typeof(TResult); ////获得TResult 的所有的Public 属性 并找出TResult属性和DataTable的列名称相同的属性(PropertyInfo) 并加入到属性列表 //Array.ForEach<PropertyInfo>(t.GetProperties(), p => { if (dt.Columns.IndexOf(p.Name) != -1) prlist.Add(p); }); ////创建返回的集合 //List<TResult> oblist = new List<TResult>(); //foreach (DataRow row in dt.Rows) //{ // //创建TResult的实例 // TResult ob = new TResult(); // //找到对应的数据 并赋值 // prlist.ForEach(p => { if (row[p.Name] != DBNull.Value) p.SetValue(ob, row[p.Name], null); }); // //放入到返回的集合中. // oblist.Add(ob); //} //return oblist; ////*/ //#endregion /////////////////////////////////////////////////////////// //#region 第二种方法 //第二种方法 // 定义集合 //List<TResult> ts = new List<TResult>(); //// 获得此模型的类型 //Type type = typeof(TResult); //List<PropertyInfo> propertys = null; //foreach (DataRow dr in dt.Rows) //{ // TResult _t = new TResult(); // // 获得此模型的公共属性 // if (propertys == null) // { // propertys = new List<PropertyInfo>(); // PropertyInfo[] propertysA = _t.GetType().GetProperties(); // foreach (PropertyInfo pi in propertysA) // { // if (pi.CanWrite && dt.Columns.Contains(pi.Name)) // propertys.Add(pi); // } // } // foreach (PropertyInfo _PropertyInfo in propertys) // { // object value = dr[_PropertyInfo.Name]; // if (value != DBNull.Value) // _PropertyInfo.SetValue(_t, value, null); // } // ts.Add(_t); //} //return ts; //#endregion /////////////////////////////////////////////////////////// //#region 第三种方法 // List<TResult> list = new List<TResult>(); // if (dt == null || dt.Rows.Count < 1) return list; // DataTableEntityBuilder<TResult> eblist = DataTableEntityBuilder<TResult>.CreateBuilder(dt.Rows[0]); // foreach (DataRow info in dt.Rows) list.Add(eblist.Build(info)); // dt.Dispose(); dt = null; // return list; // //#endregion //} public static List <TResult> ToList <TResult>(this DataTable dt) where TResult : EntityBase <TResult>, new() { //第一种方法 //获取TResult的类型实例 反射的入口 Type t = typeof(TResult); if (t.BaseType != typeof(EntityBase <TResult>)) { List <TResult> list = new List <TResult>(); if (dt == null || dt.Rows.Count < 1) { return(list); } DataTableEntityBuilder <TResult> eblist = DataTableEntityBuilder <TResult> .CreateBuilder(dt.Rows[0]); foreach (DataRow info in dt.Rows) { list.Add(eblist.Build(info)); } dt.Dispose(); dt = null; return(list); } else { //创建一个属性的列表 List <PropertyInfo2> prlist = new List <PropertyInfo2>(); Hashtable Ht = new Hashtable(); //获得TResult 的所有的Public 属性 并找出TResult属性和DataTable的列名称相同的属性(PropertyInfo) 并加入到属性列表 Array.ForEach <PropertyInfo>(t.GetProperties(), p => { if (dt.Columns.IndexOf(p.Name) != -1) { prlist.Add(new PropertyInfo2(p.Name)); } }); List <TResult> oblist = new List <TResult>(); foreach (DataRow row in dt.Rows) { EntityBase <TResult> ob = new TResult() as EntityBase <TResult>; ob._Prlist = prlist; Dictionary <string, object> result = new Dictionary <string, object>(); foreach (DataColumn dc in dt.Columns) { result.Add(dc.ColumnName, row[dc]); } ob._DataRow = result; oblist.Add(ob as TResult); } return(oblist); } }
public static List <TResult> ToList <TResult>(this DataTable dt) where TResult : class, new() { List <TResult> list = new List <TResult>(); if (dt == null) { return(list); } DataTableEntityBuilder <TResult> eblist = DataTableEntityBuilder <TResult> .CreateBuilder(dt.Rows[0]); foreach (DataRow info in dt.Rows) { list.Add(eblist.Build(info)); } dt.Dispose(); dt = null; return(list); }
public static List <T> ToListByEmit <T>(this DataTable dt) where T : class, new() { List <T> list = new List <T>(); if (dt == null || dt.Rows.Count == 0) { return(list); } var eblist = DataTableEntityBuilder <T> .CreateBuilder(dt.Rows[0]); foreach (DataRow info in dt.Rows) { list.Add(eblist.Build(info)); } dt.Dispose(); dt = null; return(list); }
/// <summary> /// DataTable转换List /// </summary> /// <typeparam name="T"></typeparam> /// <param name="dt"></param> /// <returns></returns> public List <T> DataTableToList <T>(DataTable dt) { if (dt != null && dt.Rows.Count > 0) { List <T> list = new List <T>(); DataTableEntityBuilder <T> eblist = DataTableEntityBuilder <T> .CreateBuilder(dt.Rows[0]); foreach (DataRow info in dt.Rows) { list.Add(eblist.Build(info)); } dt.Dispose(); dt = null; return(list); } else { return(null); } }
/// <summary> /// DataRow转实体 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="dr"></param> /// <returns></returns> public T DataRowToEntity <T>(DataRow dr) { DataTableEntityBuilder <T> eblist = DataTableEntityBuilder <T> .CreateBuilder(dr); return(eblist.Build(dr)); }