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)); }
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); }
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); }
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)); }
protected abstract Expression GetPopulationGuard(IMemberPopulationContext context);
protected override Expression GetPopulationGuard(IMemberPopulationContext context) => context.PopulateCondition;