public static IDataReaderEntityBuilder <T> CreateBuilder(Type type, IDataRecord dataRecord)
        {
            {
                IDataReaderEntityBuilder <T> dynamicBuilder = new IDataReaderEntityBuilder <T>();
                DynamicMethod method = new DynamicMethod("DynamicCreateEntity", type,
                                                         new Type[] { typeof(IDataRecord) }, type, true);
                ILGenerator  generator = method.GetILGenerator();
                LocalBuilder result    = generator.DeclareLocal(type);
                generator.Emit(OpCodes.Newobj, type.GetConstructor(Type.EmptyTypes));
                generator.Emit(OpCodes.Stloc, result);
                for (int i = 0; i < dataRecord.FieldCount; i++)
                {
                    string       fieldName    = dataRecord.GetName(i);
                    PropertyInfo propertyInfo = type.GetProperty(fieldName);
                    Label        endIfLabel   = generator.DefineLabel();
                    if (propertyInfo != null && propertyInfo.GetSetMethod() != null)
                    {
                        bool isNullable = false;
                        var  underType  = SqlSugarTool.GetUnderType(propertyInfo, ref isNullable);

                        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);
                        GeneratorCallMethod(generator, underType, isNullable, propertyInfo, dataRecord.GetDataTypeName(i), fieldName);
                        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="type"></param>
        /// <param name="dataRecord"></param>
        /// <returns></returns>
        public static IDataReaderEntityBuilder <T> CreateBuilder(Type type, IDataRecord dataRecord)
        {
            IDataReaderEntityBuilder <T> dynamicBuilder = new IDataReaderEntityBuilder <T>();
            DynamicMethod method = new DynamicMethod("DynamicCreateEntity", type,
                                                     new Type[] { typeof(IDataRecord) }, type, true);
            ILGenerator  generator = method.GetILGenerator();
            LocalBuilder result    = generator.DeclareLocal(type);

            generator.Emit(OpCodes.Newobj, type.GetConstructor(Type.EmptyTypes));
            generator.Emit(OpCodes.Stloc, result);
            string cacheKey = "SqlSugarClient.InitAttributes";
            var    cm       = CacheManager <List <KeyValue> > .GetInstance();

            var tFieldNames = typeof(T).GetProperties().Select(it => it.Name).ToList();

            for (int i = 0; i < dataRecord.FieldCount; i++)
            {
                string dbFieldName = dataRecord.GetName(i);
                if (cm.ContainsKey(cacheKey) && cm[cacheKey].Any(it => it.Value.ToLower() == dbFieldName.ToLower()))
                {
                    var classFieldName = cm[cacheKey].Single(it => it.Value.ToLower() == dbFieldName.ToLower()).Key;
                    if (tFieldNames.Any(it => it.ToLower() == classFieldName.ToLower()))//T包含映射属性
                    {
                        dbFieldName = classFieldName;
                    }
                }
                else
                {
                    if (tFieldNames.Any(it => it.ToLower() == dbFieldName.ToLower()))
                    {
                        dbFieldName = tFieldNames.Single(it => it.ToLower() == dbFieldName.ToLower());
                    }
                    else
                    {
                        continue;
                    }
                }

                PropertyInfo propertyInfo = type.GetProperty(dbFieldName);
                Label        endIfLabel   = generator.DefineLabel();
                if (propertyInfo != null && propertyInfo.GetSetMethod() != null)
                {
                    bool isNullable = false;
                    var  underType  = SqlSugarTool.GetUnderType(propertyInfo, ref isNullable);

                    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);
                    GeneratorCallMethod(generator, underType, isNullable, propertyInfo, dataRecord.GetDataTypeName(i), dbFieldName);
                    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);
        }