예제 #1
0
            public static MemberExpression GetMember(LambdaExpression expression)
            {
                var visitor = new MemberExpessionVisitor(expression.Parameters[0]);

                visitor.Visit(expression);
                return(visitor.Result);
            }
예제 #2
0
        private static string CreateEntryDescription(BuilderConfigurationEntry entry, Type sourceType, Type targetType)
        {
            var sourceTypeName = sourceType.Name;
            var targetTypeName = targetType.Name;

            if (entry.MapType == MapType.MapAll)
            {
                return(string.Format("MapAll: {0}->{1}", sourceTypeName, targetTypeName));
            }
            if (entry.MapType == MapType.MapFunction)
            {
                return(string.Format("MappingFunction({0}, {1})", sourceTypeName, targetTypeName));
            }
            if (entry.MapType == MapType.MapIgnore)
            {
                var sourceTargetEntry = (BuilderConfigurationIgnoreEntry)entry;
                var targetMember      = MemberExpessionVisitor.GetMember(sourceTargetEntry.TargetExpression);
                var result            = string.Format("Ignored: -> {0}.{1}", targetTypeName, targetMember == null ? "?" : targetMember.Member.Name);
                return(result);
            }
            else
            {
                //Entry MUST be BuilderConfigurationSourceTargetExpressionEntry for any other MapTypes...
                var sourceTargetEntry = (BuilderConfigurationSourceTargetExpressionEntry)entry;
                var sourceMember      = MemberExpessionVisitor.GetMember(sourceTargetEntry.SourceExpression);
                var targetMember      = MemberExpessionVisitor.GetMember(sourceTargetEntry.TargetExpression);

                var result = string.Format("{0}.{1} -> {2}.{3}",
                                           sourceTypeName,
                                           sourceMember == null ? "?" : sourceMember.Member.Name,
                                           targetTypeName,
                                           targetMember == null ? "?" : targetMember.Member.Name
                                           );

                return(result);
            }
        }
예제 #3
0
        public MappingConfiguration Build()
        {
            var configEntries = new List <MappingConfigurationEntry>();

            //Create a copy of builder entries, and add all MapAll's to it... (remove all MapAlls from the copy)
            var mapAllResults = new List <BuilderConfigurationEntry>();
            var mapAllErrors  = new List <string>();

            foreach (var entry in _builderEntries.Where(x => x.MapType == MapType.MapAll))
            {
                mapAllResults.AddRange(MapAllHelper.MapAll(_builderEntries, _conversions, entry.SourceType, entry.TargetType, mapAllErrors));
            }
            if (mapAllErrors.Any())
            {
                throw new MappingException(string.Format("The following error(s) occurred while building the mapper:\r\n{0}", string.Join("\r\n", mapAllErrors)));
            }

            //Add the extra entries from MappingAll to a temporary list.
            var builderEntries = _builderEntries.ToList();

            builderEntries.AddRange(mapAllResults);

            foreach (var entry in builderEntries)
            {
                var sourceType       = entry.SourceType;
                var targetType       = entry.TargetType;
                var entryDescription = CreateEntryDescription(entry, sourceType, targetType);
                var hasDependency    = entry.HasDependencyArgument;

                if (entry.MapType == MapType.MapProperty)
                {
                    var sourceTargetEntry = (BuilderConfigurationSourceTargetExpressionEntry)entry;
                    var action            = CreateMappingAction(sourceTargetEntry.SourceExpression, sourceTargetEntry.TargetExpression, sourceTargetEntry.Converter);
                    var configEntry       = new MappingConfigurationPropertyEntry(
                        sourceType,
                        targetType,
                        entryDescription,
                        action,
                        hasDependency ? sourceTargetEntry.SourceExpression.Parameters[1].Type : null,
                        sourceTargetEntry.NamedResolutions);

                    configEntries.Add(configEntry);
                }
                else if (entry.MapType == MapType.MapObject)
                {
                    var sourceTargetEntry = (BuilderConfigurationSourceTargetExpressionEntry)entry;
                    var targetMember      = MemberExpessionVisitor.GetMember(sourceTargetEntry.TargetExpression);
                    if (targetMember == null)
                    {
                        throw new MappingException("Could not find object type on target");
                    }

                    var configEntry = new MappingConfigurationObjectEntry(
                        sourceType,
                        targetType,
                        entryDescription,
                        CreateGetterFunction(sourceTargetEntry.SourceExpression),
                        CreateGetterFunction(sourceTargetEntry.TargetExpression),
                        CreateObjectSetterMappingAction(sourceTargetEntry.TargetExpression),
                        sourceTargetEntry.TargetExpression.ReturnType);

                    configEntries.Add(configEntry);
                }
                else if (entry.MapType == MapType.MapCollection)
                {
                    var sourceTargetEntry = (BuilderConfigurationSourceTargetExpressionEntry)entry;
                    var targetMember      = MemberExpessionVisitor.GetMember(sourceTargetEntry.TargetExpression);
                    if (targetMember == null)
                    {
                        throw new MappingException("Could not find collection type on target");
                    }

                    var configEntry = new MappingConfigurationCollectionEntry(
                        sourceType,
                        targetType,
                        entryDescription,
                        CreateGetterFunction(sourceTargetEntry.SourceExpression),
                        CreateGetterFunction(sourceTargetEntry.TargetExpression),
                        CreateObjectSetterMappingAction(sourceTargetEntry.TargetExpression),
                        targetMember.Type);

                    configEntries.Add(configEntry);
                }
                else if (entry.MapType == MapType.MapFunction)
                {
                    var functionEntry = (BuilderConfigurationFunctionMapEntry)entry;

                    var configEntry = new MappingConfigurationFunctionEntry(
                        sourceType,
                        targetType,
                        entryDescription,
                        functionEntry.Action,
                        functionEntry.DependencyTupleType,
                        functionEntry.NamedResolutions
                        );

                    configEntries.Add(configEntry);
                }
            }
            return(new MappingConfiguration(configEntries));
        }