Exemplo n.º 1
0
        public static Expression GetDerivedTypeMapping(
            IObjectMappingData declaredTypeMappingData,
            Expression sourceValue,
            Type targetType)
        {
            var declaredTypeMapperData = declaredTypeMappingData.MapperData;

            var targetValue = declaredTypeMapperData.TargetMember.IsReadable
                ? declaredTypeMapperData.TargetObject.GetConversionTo(targetType)
                : Expression.Default(targetType);

            var derivedTypeMappingData = declaredTypeMappingData.WithTypes(sourceValue.Type, targetType);

            if (declaredTypeMappingData.IsRoot)
            {
                return(GetDerivedTypeRootMapping(derivedTypeMappingData, sourceValue, targetValue));
            }

            if (declaredTypeMapperData.TargetMemberIsEnumerableElement())
            {
                return(GetInlineElementMappingBlock(derivedTypeMappingData, sourceValue, targetValue));
            }

            return(GetDerivedTypeChildMapping(derivedTypeMappingData, sourceValue, targetValue));
        }
Exemplo n.º 2
0
        public static Expression GetDerivedTypeMapping(
            IObjectMappingData declaredTypeMappingData,
            Expression sourceValue,
            Type targetType,
            out IObjectMappingData derivedTypeMappingData)
        {
            derivedTypeMappingData = declaredTypeMappingData.WithTypes(sourceValue.Type, targetType);

            var declaredTypeMapperData = declaredTypeMappingData.MapperData;

            if (DerivedSourceTypeIsUnconditionallyIgnored(derivedTypeMappingData))
            {
                return(declaredTypeMapperData.TargetObject.GetConversionTo(targetType));
            }

            var targetValue = declaredTypeMapperData.TargetMember.IsReadable
                ? declaredTypeMapperData.TargetObject.GetConversionTo(targetType)
                : targetType.ToDefaultExpression();

            if (declaredTypeMappingData.IsRoot)
            {
                return(GetDerivedTypeRootMapping(derivedTypeMappingData, sourceValue, targetValue));
            }

            if (declaredTypeMapperData.TargetMemberIsEnumerableElement())
            {
                return(MappingFactory.GetElementMapping(derivedTypeMappingData, sourceValue, targetValue));
            }

            return(GetDerivedTypeChildMapping(derivedTypeMappingData, sourceValue, targetValue));
        }
Exemplo n.º 3
0
        private static Expression GetDerivedTypeSourceValue(
            DerivedTypePair derivedTypePair,
            IObjectMappingData declaredTypeMappingData,
            out Expression sourceValueCondition)
        {
            if (!derivedTypePair.IsImplementationPairing)
            {
                sourceValueCondition = null;
                return(declaredTypeMappingData.MapperData.SourceObject);
            }

            var implementationMappingData = declaredTypeMappingData
                                            .WithTypes(derivedTypePair.DerivedSourceType, derivedTypePair.DerivedTargetType);

            if (implementationMappingData.IsTargetConstructable())
            {
                sourceValueCondition = null;
                return(declaredTypeMappingData.MapperData.SourceObject);
            }

            // Derived Type is an implementation Type for an unconstructable target Type,
            // and is itself unconstructable; only way we get here is if a ToTarget data
            // source has been configured:
            var toTargetDataSource = implementationMappingData
                                     .GetToTargetDataSourceOrNullForTargetType();

            sourceValueCondition = toTargetDataSource.IsConditional
                ? toTargetDataSource.Condition.Replace(
                implementationMappingData.MapperData.SourceObject,
                declaredTypeMappingData.MapperData.SourceObject,
                ExpressionEvaluation.Equivalator)
                : null;

            return(toTargetDataSource.Value.Replace(
                       implementationMappingData.MapperData.SourceObject,
                       declaredTypeMappingData.MapperData.SourceObject,
                       ExpressionEvaluation.Equivalator));
        }