コード例 #1
0
        private static Expression GetReadOnlyMemberPopulation(IMemberPopulationContext context)
        {
            var dataSourcesValue    = context.DataSources.ValueExpression;
            var targetMemberAccess  = context.MapperData.GetTargetMemberAccess();
            var targetMemberNotNull = targetMemberAccess.GetIsNotDefaultComparison();

            return(Expression.IfThen(targetMemberNotNull, dataSourcesValue));
        }
コード例 #2
0
        private Expression GetBinding(IMemberPopulationContext context, Expression populationGuard)
        {
            var bindingValue        = context.DataSources.ValueExpression;
            var guardedBindingValue = GetGuardedBindingValue(bindingValue, populationGuard);
            var binding             = context.MapperData.GetTargetMemberPopulation(guardedBindingValue);

            return(binding);
        }
コード例 #3
0
        protected override Expression GetPopulationGuard(IMemberPopulationContext context)
        {
            var mapperData = context.MapperData;
            var populateCondition = context.PopulateCondition;

            if (SkipPopulationGuarding(mapperData))
            {
                return populateCondition;
            }

            var existingValueIsDefault = mapperData.TargetMember.GetHasDefaultValueCheck(mapperData);

            if (populateCondition == null)
            {
                return existingValueIsDefault;
            }

            return Expression.AndAlso(populateCondition, existingValueIsDefault);
        }
コード例 #4
0
        public Expression GetPopulation(IMemberPopulationContext context)
        {
            if (!context.IsSuccessful)
            {
                return(context.DataSources.ValueExpression);
            }

            var useSingleExpression = context.MapperData.UseMemberInitialisations();
            var populationGuard     = GetPopulationGuard(context);

            var population = useSingleExpression
                ? GetBinding(context, populationGuard)
                : context.MapperData.TargetMember.IsReadOnly
                    ? GetReadOnlyMemberPopulation(context)
                    : context.DataSources.GetPopulationExpression();

            if (context.DataSources.Variables.Any())
            {
                population = Expression.Block(context.DataSources.Variables, population);
            }

            return(GetGuardedPopulation(population, populationGuard, useSingleExpression));
        }
コード例 #5
0
 protected abstract Expression GetPopulationGuard(IMemberPopulationContext context);
コード例 #6
0
 protected override Expression GetPopulationGuard(IMemberPopulationContext context)
 => context.PopulateCondition;