コード例 #1
0
        public IEnumerable <Expression> GetPopulation(MappingCreationContext context)
        {
            var mappingData = context.MappingData;
            var mapperData  = context.MapperData;

            GetCreationCallbacks(context, out var preCreationCallback, out var postCreationCallback);

            var populationsAndCallbacks = GetPopulationsAndCallbacks(mappingData).ToList();

            if (context.InstantiateLocalVariable && mapperData.Context.UseLocalVariable)
            {
                yield return(preCreationCallback);

                var assignCreatedObject = postCreationCallback != null;

                yield return(GetLocalVariableInstantiation(assignCreatedObject, populationsAndCallbacks, mappingData));

                yield return(postCreationCallback);
            }

            yield return(GetObjectRegistrationCallOrNull(mapperData));

            foreach (var population in populationsAndCallbacks)
            {
                yield return(population);
            }

            mappingData.MapperKey.AddSourceMemberTypeTesterIfRequired(mappingData);
        }
コード例 #2
0
        public static Expression GetMappingOrNull(
            MappingCreationContext context,
            out bool isConditional)
        {
            var mappingData            = context.MappingData;
            var derivedTypeDataSources = DerivedComplexTypeDataSourcesFactory.CreateFor(mappingData);

            if (derivedTypeDataSources.None())
            {
                isConditional = false;
                return(null);
            }

            var derivedTypeDataSourceSet = DataSourceSet.For(
                derivedTypeDataSources,
                mappingData,
                ValueExpressionBuilders.ValueSequence);

            isConditional =
                derivedTypeDataSources.Last().IsConditional&&
                !mappingData.MapperData.TargetType.IsAbstract();

            if (!isConditional)
            {
                context.MappingComplete = true;
            }

            return(derivedTypeDataSourceSet.BuildValue());
        }
コード例 #3
0
        protected override IEnumerable <Expression> GetObjectPopulation(MappingCreationContext context)
        {
            var expressionFactory = context.MapperData.UseMemberInitialisations()
                ? _memberInitPopulationFactory
                : _multiStatementPopulationFactory;

            return(expressionFactory.GetPopulation(context));
        }
コード例 #4
0
        protected override void AddObjectPopulation(MappingCreationContext context)
        {
            var expressionFactory = context.MapperData.UseMemberInitialisations()
                ? _memberInitPopulationFactory
                : _multiStatementPopulationFactory;

            expressionFactory.AddPopulation(context);
        }
コード例 #5
0
        public void AddPopulation(MappingCreationContext context)
        {
            var mappingData = context.MappingData;
            var mapperData  = mappingData.MapperData;

            GetCreationCallbacks(context, out var preCreationCallback, out var postCreationCallback);

            var populationsAndCallbacks = GetPopulationsAndCallbacks(mappingData).ToList();
            var guardPopulations        = false;

            if (context.InstantiateLocalVariable && mapperData.Context.UseLocalVariable)
            {
                context.MappingExpressions.AddUnlessNullOrEmpty(preCreationCallback);

                var hasPostCreationCallback = postCreationCallback != null;
                var assignCreatedObject     = hasPostCreationCallback;

                var localVariableInstantiation = GetLocalVariableInstantiation(
                    assignCreatedObject,
                    populationsAndCallbacks,
                    mappingData);

                context.MappingExpressions.Add(localVariableInstantiation);

                guardPopulations = LocalVariableCouldBeNull(localVariableInstantiation);

                if (hasPostCreationCallback)
                {
                    context.MappingExpressions.Add(postCreationCallback);
                }
            }

            if (IncludeObjectRegistration(mapperData))
            {
                context.MappingExpressions.Add(GetObjectRegistrationCall(mapperData));
            }

            if (populationsAndCallbacks.None())
            {
                goto AddTypeTester;
            }

            if (guardPopulations)
            {
                context.MappingExpressions.Add(Expression.IfThen(
                                                   mappingData.MapperData.LocalVariable.GetIsNotDefaultComparison(),
                                                   Expression.Block(populationsAndCallbacks)));

                goto AddTypeTester;
            }

            context.MappingExpressions.AddRange(populationsAndCallbacks);

AddTypeTester:
            mappingData.MapperKey.AddSourceMemberTypeTesterIfRequired(mappingData);
        }
コード例 #6
0
        public static IDataSource Create(
            IQualifiedMember sourceMember,
            int dataSourceIndex,
            IChildMemberMappingData childMappingData)
        {
            var childMapperData = childMappingData.MapperData;

            if (!childMapperData.MapperContext.UserConfigurations.HasMappingFactories)
            {
                return(new NullDataSource(Constants.EmptyExpression));
            }

            var childObjectMappingData = ObjectMappingDataFactory.ForChild(
                sourceMember,
                childMapperData.TargetMember,
                dataSourceIndex,
                childMappingData.Parent);

            var childCreationContext = new MappingCreationContext(childObjectMappingData);

            var mapping = ConfiguredMappingFactory
                          .GetMappingOrNull(childCreationContext, out _);

            if (mapping == null)
            {
                return(new NullDataSource(Constants.EmptyExpression));
            }

            var childObjectMapperData = childObjectMappingData.MapperData;
            var sourceMemberAccess    = sourceMember.GetRelativeQualifiedAccess(childMapperData);
            var targetMemberAccess    = childMapperData.GetTargetMemberAccess();

            var mappingValues = new MappingValues(
                sourceMemberAccess,
                targetMemberAccess,
                childMapperData.ElementIndex,
                childMapperData.ElementKey,
                dataSourceIndex);

            var directAccessMapping = MappingFactory.GetDirectAccessMapping(
                mapping,
                childObjectMapperData,
                mappingValues,
                MappingDataCreationFactory.ForChild(mappingValues, childObjectMapperData));

            var returnValue = childObjectMapperData
                              .GetFinalisedReturnValue(directAccessMapping, out var returnsDefault);

            if (returnsDefault)
            {
                returnValue = Expression.Block(directAccessMapping, returnValue);
            }

            return(new AdHocDataSource(sourceMember, returnValue, childMapperData));
        }
コード例 #7
0
        private static void GetCreationCallbacks(
            MappingCreationContext context,
            out Expression preCreationCallback,
            out Expression postCreationCallback)
        {
            if (context.RuleSet.Settings.UseSingleRootMappingExpression ||
                !context.InstantiateLocalVariable ||
                context.MapperData.TargetIsDefinitelyPopulated())
            {
                preCreationCallback = postCreationCallback = null;
                return;
            }

            preCreationCallback  = GetCreationCallbackOrNull(Before, context.MapperData);
            postCreationCallback = GetCreationCallbackOrNull(After, context.MapperData);
        }
コード例 #8
0
        protected override IEnumerable <Expression> GetObjectPopulation(MappingCreationContext context)
        {
            var mapperData = context.MapperData;

            var queryProjection = mapperData
                                  .EnumerablePopulationBuilder
                                  .GetSourceItemsProjection(
                mapperData.SourceObject,
                sourceParameter => MappingFactory.GetElementMapping(
                    sourceParameter,
                    mapperData.TargetMember.ElementType.ToDefaultExpression(),
                    context.MappingData));

            queryProjection = QueryProjectionModifier.Modify(queryProjection, context.MappingData);

            yield return(queryProjection);
        }
コード例 #9
0
        protected override IEnumerable <Expression> GetObjectPopulation(MappingCreationContext context)
        {
            if (!context.MapperData.SourceMember.IsEnumerable)
            {
                yield break;
            }

            var elementMapperData = context.MapperData.GetElementMapperData();

            if (elementMapperData.IsRepeatMapping() &&
                context.RuleSet.RepeatMappingStrategy.WillNotMap(elementMapperData))
            {
                yield break;
            }

            yield return(context.RuleSet.EnumerablePopulationStrategy.GetPopulation(
                             context.MapperData.EnumerablePopulationBuilder,
                             context.MappingData));
        }
コード例 #10
0
        protected override bool ShortCircuitMapping(MappingCreationContext context, out Expression mapping)
        {
            var derivedTypeDataSources = DerivedComplexTypeDataSourcesFactory.CreateFor(context.MappingData);

            if (derivedTypeDataSources.None())
            {
                return(base.ShortCircuitMapping(context, out mapping));
            }

            var derivedTypeDataSourceSet = DataSourceSet.For(
                derivedTypeDataSources,
                context.MapperData,
                ValueExpressionBuilders.ValueSequence);

            mapping = derivedTypeDataSourceSet.BuildValue();

            if (derivedTypeDataSources.Last().IsConditional)
            {
                context.MappingExpressions.Add(mapping);
                return(false);
            }

            var shortCircuitReturns = GetShortCircuitReturns(context.MappingData).ToArray();

            if (shortCircuitReturns.Any())
            {
                context.MappingExpressions.AddRange(shortCircuitReturns);
            }

            if (mapping.NodeType == ExpressionType.Goto)
            {
                mapping = ((GotoExpression)mapping).Value;
                context.MappingExpressions.Add(context.MapperData.GetReturnLabel(mapping));
            }
            else
            {
                context.MappingExpressions.Add(mapping);
                context.MappingExpressions.Add(context.MapperData.GetReturnLabel(mapping.Type.ToDefaultExpression()));
            }

            mapping = Expression.Block(context.MappingExpressions);
            return(true);
        }
コード例 #11
0
        protected override void AddObjectPopulation(MappingCreationContext context)
        {
            if (!HasCompatibleSourceMember(context.MapperData))
            {
                return;
            }

            var elementContext = context.MapperData.GetElementMemberContext();

            if (elementContext.IsRepeatMapping() &&
                context.RuleSet.RepeatMappingStrategy.WillNotMap(elementContext))
            {
                return;
            }

            var population = context.RuleSet.EnumerablePopulationStrategy.Invoke(
                context.MapperData.EnumerablePopulationBuilder,
                context.MappingData);

            context.MappingExpressions.Add(population);
        }