Пример #1
0
        private ObjectsMapperBaseImpl BuildObjectsMapper(
            string MapperTypeName,
            Type from,
            Type to,
            IMappingConfigurator mappingConfigurator)
        {
            TypeBuilder typeBuilder = DynamicAssemblyManager.DefineMapperType(MapperTypeName);

            CreateTargetInstanceBuilder.BuildCreateTargetInstanceMethod(to, typeBuilder);

            var mappingBuilder = new MappingBuilder(
                this,
                from,
                to,
                typeBuilder,
                mappingConfigurator
                );

            mappingBuilder.BuildCopyImplMethod();

            ObjectsMapperBaseImpl result =
                (ObjectsMapperBaseImpl)Activator.CreateInstance(typeBuilder.CreateType());

            result.Initialize(this, from, to, mappingConfigurator, mappingBuilder.storedObjects.ToArray());
            return(result);
        }
Пример #2
0
        //private ModelConverter()
        //{
        //}

        /// <summary>
        /// object转换
        /// </summary>
        /// <typeparam name="TIn"></typeparam>
        /// <typeparam name="TOut"></typeparam>
        /// <param name="inData"></param>
        /// <returns></returns>
        public static TOut ConvertObject <TIn, TOut>(TIn inData)
        {
            Type tin  = typeof(TIn);
            Type tout = typeof(TOut);

            string typeKey = string.Concat(tin, "|", tout);
            ObjectsMapperBaseImpl     mapperBase = null;
            ObjectsMapper <TIn, TOut> mapper     = null;

            if (_dictMapping.TryGetValue(typeKey, out mapperBase))
            {
                mapper = new ObjectsMapper <TIn, TOut>(mapperBase);
            }
            else
            {
                mapper = ObjectMapperManager.DefaultInstance.GetMapper <TIn, TOut>();
                _dictMapping[typeKey] = mapper.MapperImpl;
            }

            return(mapper.Map(inData));
        }
Пример #3
0
        public static bool BuildUpdateCommand(
            this DbCommand cmd,
            object obj,
            string tableName,
            IEnumerable <string> idFieldNames,
            IEnumerable <string> includeFields,
            IEnumerable <string> excludeFields,
            ObjectsChangeTracker changeTracker,
            DbSettings dbSettings
            )
        {
            if (idFieldNames == null)
            {
                idFieldNames = new string[0];
            }

            //idFieldNames = idFieldNames.Select(n => n.ToUpper()).ToArray(); //不Upper会怎样

            if (changeTracker != null)
            {
                ObjectsChangeTracker.TrackingMember[] changedFields = changeTracker.GetChanges(obj);
                if (changedFields != null)
                {
                    includeFields = includeFields == null?changedFields.Select(c => c.name).Except(idFieldNames).ToArray()
                                        : includeFields.Intersect(changedFields.Select(c => c.name)).Except(idFieldNames).ToArray();
                }
            }
            if (includeFields != null)
            {
                includeFields = includeFields.Concat(idFieldNames);
            }
            IMappingConfigurator config = new AddDbCommandsMappingConfig(
                dbSettings,
                includeFields,
                excludeFields,
                "updateop_inc_" + includeFields.ToCSV("_") + "_exc_" + excludeFields.ToCSV("_")
                );

            ObjectsMapperBaseImpl mapper = ObjectMapperManager.DefaultInstance.GetMapperImpl(
                obj.GetType(),
                typeof(DbCommand),
                config
                );

            string[] fields = mapper
                              .StroredObjects
                              .OfType <SrcReadOperation>()
                              .Select(m => m.Source.MemberInfo.Name)
                              .Where(f => !idFieldNames.Contains(f))
                              .Except(idFieldNames)
                              .ToArray(); //2014-4-29 cannot change id.

            if (fields.Length == 0)
            {
                return(false);
            }

            var enableCol = new string[] { "TableName", "IdName" };

            fields = fields.Where(c => !enableCol.Contains(c)).ToArray();

            string cmdStr =
                "UPDATE " +
                tableName +
                " SET " +
                fields.Select(
                    f => dbSettings.GetEscapedName(f) + "=" + dbSettings.GetParamName(f)
                    )
                .ToCSV(",") +
                " WHERE " +
                idFieldNames.Select(fn => dbSettings.GetEscapedName(fn) + "=" + dbSettings.GetParamName(fn))
                .ToCSV(" AND ")
            ;

            cmd.CommandText = cmdStr;
            cmd.CommandType = CommandType.Text;

            mapper.Map(obj, cmd, null);
            return(true);
        }
Пример #4
0
 public ObjectsMapperDescr(ObjectsMapperBaseImpl mapper, MapperKey key, int id)
 {
     this.mapper = mapper;
     this.key    = key;
     this.id     = id;
 }
Пример #5
0
 public ObjectsMapper(ObjectsMapperBaseImpl mapperImpl)
 {
     MapperImpl = mapperImpl;
 }
Пример #6
0
        /// <summary>
        /// Creates a new type based on T , marks each public property of T
        /// with ProtoMember, DataMember attributes. Also marks the classes
        /// as ProtoContract or DataContract attributes.
        /// </summary>
        private void CreateClonedTypeWithAttributes()
        {
            string typeName = TypeOfActualObject.AssemblyQualifiedName ?? TypeOfActualObject.Name;

            _assemblyName = Convert.ToBase64String(Encoding.ASCII.GetBytes(typeName));

            if (!TryAndLoadClonedTypeAssembly())
            {
                TypeBuilder typeBuilder = CreateTypeBuilder();
                var         findProps   = from propertyInfo in TypeOfActualObject.GetProperties()
                                          .Where(iPropInfo => SystemTypes.fclDlls.Contains(iPropInfo.PropertyType.Assembly.FullName) &&
                                                 iPropInfo.MemberType == MemberTypes.Property &&
                                                 iPropInfo.GetSetMethod() != null)
                                          select propertyInfo;

                List <PropertyInfo> props = findProps.ToList();
                int protoMemberId         = 1;

                foreach (PropertyInfo info in props)
                {
                    FieldBuilder fieldBuilder = typeBuilder.DefineField(string.Format("m_{0}", info.Name),
                                                                        info.PropertyType,
                                                                        FieldAttributes.Private);

                    string getterName = string.Concat("get_", info.Name);
                    string setterName = string.Concat("set_", info.Name);

                    PropertyBuilder propBuilder
                        = typeBuilder.DefineProperty(info.Name,
                                                     PropertyAttributes.HasDefault,
                                                     CallingConventions.Standard,
                                                     info.PropertyType,
                                                     null);

                    //Apply ProtoMember Attribute
                    Type[]                 ctorParams          = new[] { typeof(Int32) };
                    ConstructorInfo        protoMbrCtorInfo    = typeof(ProtoMemberAttribute).GetConstructor(ctorParams);
                    CustomAttributeBuilder protoMbrAttbBuilder = new CustomAttributeBuilder(protoMbrCtorInfo, new object[] { protoMemberId++ });

                    propBuilder.SetCustomAttribute(protoMbrAttbBuilder);

                    //Apply Data Member Attribute
                    ConstructorInfo classCtorInfo = typeof(DataMemberAttribute).GetConstructor(Type.EmptyTypes);

                    CustomAttributeBuilder attributeBuilder = new CustomAttributeBuilder(classCtorInfo, new object[] { });

                    propBuilder.SetCustomAttribute(attributeBuilder);

                    MethodBuilder getPropMethdBldr = typeBuilder.DefineMethod(getterName, GetSetAttr, info.PropertyType, Type.EmptyTypes);

                    ILGenerator getterIL = getPropMethdBldr.GetILGenerator();

                    getterIL.Emit(OpCodes.Ldarg_0);
                    getterIL.Emit(OpCodes.Ldfld, fieldBuilder);
                    getterIL.Emit(OpCodes.Ret);

                    MethodBuilder setPropMethdBldr = typeBuilder.DefineMethod(setterName, GetSetAttr, null, new[] { info.PropertyType });

                    ILGenerator setterIL = setPropMethdBldr.GetILGenerator();
                    setterIL.Emit(OpCodes.Ldarg_0);
                    setterIL.Emit(OpCodes.Ldarg_1);
                    setterIL.Emit(OpCodes.Stfld, fieldBuilder);
                    setterIL.Emit(OpCodes.Ret);

                    propBuilder.SetGetMethod(getPropMethdBldr);
                    propBuilder.SetSetMethod(setPropMethdBldr);
                }

                typeBuilder.CreateType();
                //save the assembly in a preconfigured dir..
                //before we try to create it, we can load all assemblies from the directory
                _assemblyBuilder.Save(_assemblyName + ".dll");
            }

            if (TryAndLoadClonedTypeAssembly())
            {
                _mappedType        = _assembly.GetTypes()[0];
                _objectsMapperFrom = ObjectMapperManager.DefaultInstance.GetMapperImpl(TypeOfActualObject, _mappedType,
                                                                                       DefaultMapConfig.Instance);
                _objectsMapperTo = ObjectMapperManager.DefaultInstance.GetMapperImpl(_mappedType, TypeOfActualObject,
                                                                                     DefaultMapConfig.Instance);
            }
        }