///<summary> ///</summary> ///<param name="dr"></param> ///<typeparam name="T"></typeparam> ///<returns></returns> public List <T> GetList <T>(IDataReader dr) { var list = new List <T>(); var builder = DynamicBuilder <T> .CreateBuilder(dr); while (dr.Read()) { list.Add(builder.Build(dr)); } dr.Close(); return(list); }
///<summary> ///</summary> ///<param name="dataRecord"></param> ///<returns></returns> public static DynamicBuilder <T> CreateBuilder(IDataRecord dataRecord) { var dynamicBuilder = new DynamicBuilder <T>(); var method = new DynamicMethod("DynamicCreate", typeof(T), new[] { typeof(IDataRecord) }, typeof(T), true); var generator = method.GetILGenerator(); var result = generator.DeclareLocal(typeof(T)); generator.Emit(OpCodes.Newobj, typeof(T).GetConstructor(Type.EmptyTypes)); generator.Emit(OpCodes.Stloc, result); for (var i = 0; i < dataRecord.FieldCount; i++) { var fieldName = dataRecord.GetName(i); var propertyInfo = GetPropOfField(fieldName); if (propertyInfo == null) { continue; } bool isNullable = propertyInfo.PropertyType.Name.ToLower().Contains("nullable"); //判断是否为可空类型 var endIfLabel = generator.DefineLabel(); if (propertyInfo.GetSetMethod() == null) { continue; } 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, dataRecord.GetFieldType(i)); var type = dataRecord.GetFieldType(i); generator.Emit(OpCodes.Unbox_Any, isNullable ? GetNullableType(type) : type); 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> ///</summary> ///<param name="dr"></param> ///<typeparam name="T"></typeparam> ///<returns></returns> public T GetSingle <T>(IDataReader dr) { if (dr.Read()) { var obj = DynamicBuilder <T> .CreateBuilder(dr).Build(dr); if (!dr.IsClosed) { dr.Close(); } return(obj); } if (!dr.IsClosed) { dr.Close(); } return(default(T)); }