Ejemplo n.º 1
0
        ///<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);
        }
Ejemplo n.º 2
0
        ///<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);
        }
Ejemplo n.º 3
0
        ///<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));
        }