/// <summary>
        /// 拷贝副本
        /// </summary>
        /// <param name="belong">所属实体</param>
        /// <returns></returns>
        public EntityMappingInfo Copy(Type belong)
        {
            EntityMappingInfo info = new EntityMappingInfo(
                belong, GetHandle, SetHandle, _mappingInfo, _fieldName, _fieldType, BelongFieldInfo, BelongPropertyInfo);

            return(info);
        }
        /// <summary>
        /// 填充特殊信息指定标签
        /// </summary>
        /// <param name="type"></param>
        /// <param name="dicParamsInfo"></param>
        /// <param name="tableAtt"></param>
        private static void FillAttributeInfo(Type type, EntityInfoHandle classInfo)
        {
            object[] atts = type.GetCustomAttributes(true);
            foreach (object objAtt in atts)
            {
                SequenceAttributes satt = objAtt as SequenceAttributes;
                if (satt != null)
                {
                    EntityPropertyInfo info = classInfo.PropertyInfo[satt.PropertyName];
                    if (info == null)
                    {
                        throw new System.MissingMemberException("实体:" + classInfo.EntityType.FullName
                                                                + "  ,不包含属性找不到属性:" + satt.PropertyName);
                    }
                    info.ParamInfo.SequenceName = satt.SequenceName;
                    continue;
                }

                EntityParam ep = objAtt as EntityParam;
                if (ep != null)
                {
                    EntityPropertyInfo info = classInfo.PropertyInfo[ep.PropertyName];
                    if (info == null)
                    {
                        throw new System.MissingMemberException("实体:" + classInfo.EntityType.FullName
                                                                + "  ,不包含属性找不到属性:" + ep.PropertyName);
                    }
                    info.ParamInfo = ep;
                    continue;
                }

                TableRelationAttribute tra = objAtt as TableRelationAttribute;
                if (tra != null)
                {
                    EntityMappingInfo info = classInfo.MappingInfo[tra.PropertyName];
                    if (info == null)
                    {
                        throw new System.MissingMemberException("实体:" + classInfo.EntityType.FullName
                                                                + "  ,不包含属性找不到属性:" + tra.PropertyName);
                    }
                    info.MappingInfo = tra;
                    continue;
                }
            }
        }
        /// <summary>
        /// 初始化类型的属性信息
        /// </summary>
        /// <param name="type">类型</param>
        /// <returns>如果已经初始化过侧返回false</returns>
        private static EntityInfoHandle InitEntityPropertyInfos(Type type,
                                                                Dictionary <string, EntityConfigInfo> dicConfigs)
        {
            if (type == null)
            {
                return(null);
            }


            string                fullName      = type.FullName;
            TableAttribute        tableAtt      = new TableAttribute();
            CreateInstanceHandler createrHandle = null;

            //实例化本类型的句柄
            if (!type.IsGenericType)
            {
                createrHandle = FastValueGetSet.GetCreateInstanceHandlerWithOutCache(type);
            }
            Dictionary <string, EntityPropertyInfo> dicPropertys = new Dictionary <string, EntityPropertyInfo>();
            Dictionary <string, EntityMappingInfo>  dicMapping   = new Dictionary <string, EntityMappingInfo>();

            Dictionary <string, EntityParam>            dicParamsInfo   = new Dictionary <string, EntityParam>();
            Dictionary <string, TableRelationAttribute> dicRelationInfo = new Dictionary <string, TableRelationAttribute>();

            FillEntityInfos(dicParamsInfo, dicRelationInfo, type, tableAtt, dicConfigs);
            DBInfo           db        = DataAccessLoader.GetDBInfo(tableAtt.BelongDB);
            IDBAdapter       idb       = db.CurrentDbAdapter;
            EntityInfoHandle classInfo = new EntityInfoHandle(type, createrHandle, tableAtt, db);

            Dictionary <string, bool> dicNotFoundParam    = new Dictionary <string, bool>();
            Dictionary <string, bool> dicNotFoundRelation = new Dictionary <string, bool>();

            FillNotFoundField(dicParamsInfo, dicRelationInfo, dicNotFoundParam, dicNotFoundRelation);

            //属性信息句柄
            List <FieldInfoHandle> lstFields = FieldInfoHandle.GetFieldInfos(type, FastValueGetSet.AllBindingFlags, true);
            DataBaseOperate        oper      = db.DefaultOperate;

            ///读取属性别名
            foreach (FieldInfoHandle finf in lstFields)
            {
                ///通过属性来反射
                EntityParam ep = null;


                if (dicParamsInfo.TryGetValue(finf.FieldName, out ep))
                {
                    //if (tableAtt.IsParamNameUpper)
                    //{
                    //    ep.ParamName = ep.ParamName.ToUpper();
                    //}
                    string proName = ep.PropertyName;
                    //GetFieldValueHandle getHandle = FastFieldGetSet.GetGetValueHandle(finf);
                    //SetFieldValueHandle setHandle = FastFieldGetSet.GetSetValueHandle(finf);
                    if (finf.HasGetHandle || finf.HasSetHandle)
                    {
                        PropertyInfo       pinfo          = type.GetProperty(ep.PropertyName, FastValueGetSet.AllBindingFlags);
                        EntityPropertyInfo entityProperty = new EntityPropertyInfo(
                            classInfo, finf.GetHandle, finf.SetHandle, ep, finf.FieldType, finf.FieldName,
                            finf.BelongFieldInfo, pinfo);
                        dicPropertys.Add(proName, entityProperty);
                        dicNotFoundParam.Remove(finf.FieldName);
                    }
                }
                else
                {
                    TableRelationAttribute tableMappingAtt = null;

                    if (dicRelationInfo.TryGetValue(finf.FieldName, out tableMappingAtt))
                    {
                        Type targetType = DefaultType.GetRealValueType(finf.FieldType);
                        tableMappingAtt.SetEntity(type, targetType);
                        //GetFieldValueHandle getHandle = FastFieldGetSet.GetGetValueHandle(finf);
                        //SetFieldValueHandle setHandle = FastFieldGetSet.GetSetValueHandle(finf);
                        PropertyInfo      pinfo             = type.GetProperty(tableMappingAtt.PropertyName, FastValueGetSet.AllBindingFlags);
                        EntityMappingInfo entityMappingInfo = new EntityMappingInfo(
                            type, finf.GetHandle, finf.SetHandle, tableMappingAtt,
                            finf.FieldName, finf.FieldType, finf.BelongFieldInfo, pinfo);
                        dicMapping.Add(tableMappingAtt.PropertyName, entityMappingInfo);
                        dicNotFoundRelation.Remove(finf.FieldName);
                    }
                }
            }



            if (dicNotFoundParam.Count > 0 || dicNotFoundRelation.Count > 0)
            {
                StringBuilder message = new StringBuilder();

                foreach (KeyValuePair <string, bool> kvp in dicNotFoundParam)
                {
                    message.Append(kvp.Key + "、");
                }


                foreach (KeyValuePair <string, bool> kvp in dicNotFoundRelation)
                {
                    message.Append(kvp.Key + "、");
                }
                if (message.Length > 0)
                {
                    message.Remove(message.Length - 1, 1);
                }
                message.Insert(0, "类:" + type.FullName + " 找不到字段");
                throw new MissingFieldException(message.ToString());
            }
            classInfo.SetInfoHandles(dicPropertys, dicMapping);
            FillAttributeInfo(type, classInfo);
            _dicClass[fullName] = classInfo;
            return(classInfo);
        }