private ConfiguredLambdaInfo GetValueLambdaInfo(Type targetValueType)
        {
            if (_customValueLambdaInfo != null)
            {
                return(_customValueLambdaInfo);
            }
#if NET35
            var            customValueLambda = _customValueLambda.ToDlrExpression();
            const ExprType CONSTANT          = ExprType.Constant;
#else
            var            customValueLambda = _customValueLambda;
            const ExprType CONSTANT          = Constant;
#endif
            if ((customValueLambda.Body.NodeType != CONSTANT) ||
                (targetValueType == typeof(object)) ||
                customValueLambda.ReturnType.IsAssignableTo(targetValueType) ||
                _configInfo.HasTargetMemberMatcher())
            {
                return(_customValueLambdaInfo = ConfiguredLambdaInfo.For(customValueLambda, _configInfo));
            }

            var convertedConstantValue = MapperContext
                                         .GetValueConversion(customValueLambda.Body, targetValueType);

            var funcType            = Expr.GetFuncType(targetValueType);
            var valueLambda         = Expr.Lambda(funcType, convertedConstantValue);
            var valueFunc           = valueLambda.Compile();
            var value               = valueFunc.DynamicInvoke().ToConstantExpression(targetValueType);
            var constantValueLambda = Expr.Lambda(funcType, value);
            var valueLambdaInfo     = ConfiguredLambdaInfo.For(constantValueLambda, _configInfo);

            return(_customValueLambdaInfo = valueLambdaInfo);
        }
        private void ThrowIfRedundantSourceMember(ConfiguredLambdaInfo valueLambdaInfo, QualifiedMember targetMember)
        {
            if (!valueLambdaInfo.TryGetSourceMember(out var sourceMemberLambda))
            {
                return;
            }

            var mappingData = _configInfo.ToMappingData <TSource, TTarget>();

            var targetMemberMapperData  = new ChildMemberMapperData(targetMember, mappingData.MapperData);
            var targetMemberMappingData = mappingData.GetChildMappingData(targetMemberMapperData);
            var bestSourceMemberMatch   = SourceMemberMatcher.GetMatchFor(targetMemberMappingData);

            if (!bestSourceMemberMatch.IsUseable)
            {
                return;
            }

            var configuredSourceMember = sourceMemberLambda.ToSourceMember(MapperContext);

            if (!bestSourceMemberMatch.SourceMember.Matches(configuredSourceMember))
            {
                return;
            }

            throw new MappingConfigurationException(string.Format(
                                                        CultureInfo.InvariantCulture,
                                                        "Source member {0} will automatically be mapped to target {1} {2}, " +
                                                        "and does not need to be configured",
                                                        GetSourceMemberDescription(configuredSourceMember),
                                                        GetTargetMemberType(targetMember),
                                                        targetMember.GetFriendlyTargetPath(_configInfo)));
        }
        public ConfiguredDataSourceFactory CreateReverseIfAppropriate(bool isAutoReversal)
        {
            if (CannotBeReversed(out var targetMember, out _))
            {
                return(null);
            }

            var reverseConfigInfo = GetReverseConfigInfo();

            var sourceParameter    = Parameters.Create(reverseConfigInfo.SourceType, "source");
            var sourceMemberAccess = TargetMember.GetQualifiedAccess(sourceParameter);

            var sourceMemberAccessLambda = Expression.Lambda(
                Expression.GetFuncType(sourceParameter.Type, sourceMemberAccess.Type),
                sourceMemberAccess,
                sourceParameter);

            var sourceMemberLambdaInfo = ConfiguredLambdaInfo.For(sourceMemberAccessLambda);

            return(new ConfiguredDataSourceFactory(reverseConfigInfo, sourceMemberLambdaInfo, targetMember)
            {
                _isReversal = true,
                WasAutoCreated = isAutoReversal
            });
        }
Пример #4
0
        public void Using <TFactory>(TFactory factory) where TFactory : class
        {
            var factoryInfo = ConfiguredLambdaInfo.ForFunc(factory, typeof(TSource), typeof(TTarget));

            if (factoryInfo == null)
            {
                var contextTypeName = typeof(IMappingData <TSource, TTarget>).GetFriendlyName();
                var sourceTypeName  = typeof(TSource).GetFriendlyName();
                var targetTypeName  = typeof(TTarget).GetFriendlyName();
                var objectTypeName  = typeof(TObject).GetFriendlyName();

                string[] validSignatures =
                {
                    "Func<" + objectTypeName + ">",
                    $"Func<{contextTypeName}, {objectTypeName}>",
                    $"Func<{sourceTypeName}, {targetTypeName}, {objectTypeName}>",
                    $"Func<{sourceTypeName}, {targetTypeName}, int?, {objectTypeName}>"
                };

                throw new MappingConfigurationException(string.Format(
                                                            CultureInfo.InvariantCulture,
                                                            "Unable to create objects of type {0} using factory {1}: valid function signatures are {2}",
                                                            objectTypeName,
                                                            factory,
                                                            string.Join(", ", validSignatures)));
            }

            var objectFactory = ConfiguredObjectFactory.For(_configInfo, typeof(TObject), factoryInfo);

            _configInfo.MapperContext.UserConfigurations.Add(objectFactory);
        }
 public ConfiguredDataSourceFactory(
     MappingConfigInfo configInfo,
     ConfiguredLambdaInfo dataSourceLambda,
     QualifiedMember targetMember)
     : base(configInfo, dataSourceLambda, targetMember)
 {
 }
        private ConfiguredLambdaInfo GetValueLambdaInfo <TTargetValue>()
        {
            if (_customValueLambdaInfo != null)
            {
                return(_customValueLambdaInfo);
            }

#if NET35
            var customValueLambda             = _customValueLambda.ToDlrExpression();
            const Dlr.ExpressionType CONSTANT = Dlr.ExpressionType.Constant;
#else
            var customValueLambda         = _customValueLambda;
            const ExpressionType CONSTANT = ExpressionType.Constant;
#endif
            if ((customValueLambda.Body.NodeType != CONSTANT) ||
                (typeof(TTargetValue) == typeof(object)) ||
                customValueLambda.ReturnType.IsAssignableTo(typeof(TTargetValue)))
            {
                return(ConfiguredLambdaInfo.For(customValueLambda));
            }

            var convertedConstantValue = _configInfo
                                         .MapperContext
                                         .ValueConverters
                                         .GetConversion(customValueLambda.Body, typeof(TTargetValue));

            var valueLambda         = Lambda <Func <TTargetValue> >(convertedConstantValue);
            var valueFunc           = valueLambda.Compile();
            var value               = valueFunc.Invoke().ToConstantExpression(typeof(TTargetValue));
            var constantValueLambda = Lambda <Func <TTargetValue> >(value);
            var valueLambdaInfo     = ConfiguredLambdaInfo.For(constantValueLambda);

            return(valueLambdaInfo);
        }
 public CustomDataSourceTargetMemberSpecifier(
     MappingConfigInfo configInfo,
     ConfiguredLambdaInfo customValueLambda)
 {
     _configInfo            = configInfo;
     _customValueLambdaInfo = customValueLambda;
 }
 public ConfiguredDataSourceFactory(
     MappingConfigInfo configInfo,
     ConfiguredLambdaInfo dataSourceLambda,
     LambdaExpression targetMemberLambda)
     : base(configInfo, targetMemberLambda)
 {
     _dataSourceLambda = dataSourceLambda;
 }
Пример #9
0
 public MappingCallbackFactory(
     MappingConfigInfo configInfo,
     ConfiguredLambdaInfo callbackLambda,
     QualifiedMember targetMember)
     : base(configInfo, targetMember)
 {
     _callbackLambda = callbackLambda;
 }
 protected ConfiguredDataSourceFactoryBase(
     MappingConfigInfo configInfo,
     ConfiguredLambdaInfo dataSourceLambda,
     QualifiedMember targetMember)
     : base(configInfo, targetMember)
 {
     DataSourceLambda = dataSourceLambda;
 }
 public ConfiguredDataSourceFactory(
     MappingConfigInfo configInfo,
     ConfiguredLambdaInfo dataSourceLambda,
     LambdaExpression targetMemberLambda,
     bool valueCouldBeSourceMember)
     : base(configInfo, dataSourceLambda, targetMemberLambda, valueCouldBeSourceMember)
 {
 }
 public ConfiguredDictionaryEntryDataSourceFactory(
     MappingConfigInfo configInfo,
     ConfiguredLambdaInfo dataSourceLambda,
     DictionaryTargetMember targetDictionaryEntryMember)
     : base(configInfo, dataSourceLambda, QualifiedMember.All)
 {
     TargetDictionaryEntryMember = targetDictionaryEntryMember;
 }
Пример #13
0
 public ObjectCreationCallbackFactory(
     MappingConfigInfo configInfo,
     Type creationTargetType,
     ConfiguredLambdaInfo callbackLambda)
     : base(configInfo, callbackLambda, QualifiedMember.All)
 {
     _creationTargetType = creationTargetType;
 }
Пример #14
0
 private ConfiguredObjectFactory(
     MappingConfigInfo configInfo,
     Type objectType,
     ConfiguredLambdaInfo factoryInfo)
     : base(configInfo)
 {
     _objectType  = objectType;
     _factoryInfo = factoryInfo;
 }
 protected ConfiguredDataSourceFactoryBase(
     MappingConfigInfo configInfo,
     ConfiguredLambdaInfo dataSourceLambda,
     LambdaExpression targetMemberLambda,
     bool valueCouldBeSourceMember)
     : base(configInfo, targetMemberLambda)
 {
     DataSourceLambda         = dataSourceLambda;
     ValueCouldBeSourceMember = valueCouldBeSourceMember;
 }
Пример #16
0
        public CustomDataSourceTargetMemberSpecifier <TSource, TTarget> Map <TSourceValue>(TSourceValue value)
        {
            var valueLambdaInfo = ConfiguredLambdaInfo.ForFunc(value, typeof(TSource), typeof(TTarget));

            return((valueLambdaInfo != null)
                ? new CustomDataSourceTargetMemberSpecifier <TSource, TTarget>(
                       _configInfo.ForSourceValueType(valueLambdaInfo.ReturnType),
                       valueLambdaInfo)
                : GetConstantValueTargetMemberSpecifier(value));
        }
Пример #17
0
 private ConfiguredMatcherDataSourceFactory(
     MappingConfigInfo configInfo,
     Expression targetMemberMatcherExpression,
     Func <TargetMemberSelector, bool> targetMemberMatcher,
     ConfiguredLambdaInfo dataSourceLambda,
     QualifiedMember toTargetMember)
     : base(configInfo, dataSourceLambda, toTargetMember)
 {
     _targetMemberMatcherExpression = targetMemberMatcherExpression;
     _targetMemberMatcher           = targetMemberMatcher;
 }
Пример #18
0
 public ConfiguredMatcherDataSourceFactory(
     MappingConfigInfo configInfo,
     LinqExp.Expression <Func <TargetMemberSelector, bool> > targetMemberMatcher,
     ConfiguredLambdaInfo dataSourceLambda,
     QualifiedMember toTargetMember)
     : this(
         configInfo,
         targetMemberMatcher.ToDlrExpression(),
         dataSourceLambda,
         toTargetMember)
 {
 }
Пример #19
0
 public ConfiguredMatcherDataSourceFactory(
     MappingConfigInfo configInfo,
     Expression <Func <TargetMemberSelector, bool> > targetMemberMatcher,
     ConfiguredLambdaInfo dataSourceLambda,
     QualifiedMember toTargetMember)
     : this(
         configInfo,
         targetMemberMatcher?.Body,
         targetMemberMatcher?.Compile() ?? (_ => true),
         dataSourceLambda,
         toTargetMember)
 {
 }
        private ConfiguredDataSourceFactory CreateDataSourceFactory(
            ConfiguredLambdaInfo valueLambdaInfo,
            LambdaExpression targetMemberLambda)
        {
            return(new ConfiguredDataSourceFactory(
                       _configInfo,
                       valueLambdaInfo,
#if NET35
                       targetMemberLambda.ToDlrExpression(),
#else
                       targetMemberLambda,
#endif
                       _valueCouldBeSourceMember));
        }
Пример #21
0
        private MappingConfigContinuation <TSource, TTarget> CreateCallbackFactory <TAction>(TAction callback)
        {
            var callbackLambda = ConfiguredLambdaInfo.ForAction(callback, typeof(TSource), typeof(TTarget), typeof(TObject));

            var creationCallbackFactory = new ObjectCreationCallbackFactory(
                ConfigInfo,
                typeof(TObject),
                CallbackPosition,
                callbackLambda);

            ConfigInfo.MapperContext.UserConfigurations.Add(creationCallbackFactory);

            return(new MappingConfigContinuation <TSource, TTarget>(ConfigInfo));
        }
Пример #22
0
        private MappingConfigContinuation <TSource, TTarget> CreateCallbackFactory <TAction>(TAction callback)
        {
            ThrowIfStructMemberCallback();

            var callbackLambda = ConfiguredLambdaInfo
                                 .ForAction(callback, _configInfo, typeof(TSource), typeof(TTarget));

            var creationCallbackFactory = new MappingCallbackFactory(
                _configInfo,
                callbackLambda,
                _targetMember);

            _configInfo.UserConfigurations.Add(creationCallbackFactory);

            return(new MappingConfigContinuation <TSource, TTarget>(_configInfo));
        }
Пример #23
0
        private CustomDataSourceTargetMemberSpecifier <TSource, TTarget> GetConstantValueTargetMemberSpecifier <TSourceValue>(
            TSourceValue value)
        {
            var valueLambdaInfo = ConfiguredLambdaInfo.ForFunc(value, typeof(TSource), typeof(TTarget));

            if (valueLambdaInfo != null)
            {
                return(new CustomDataSourceTargetMemberSpecifier <TSource, TTarget>(
                           ConfigInfo.ForSourceValueType(valueLambdaInfo.ReturnType),
                           valueLambdaInfo));
            }
#if NET35
            var valueConstant = Expression.Constant(value, typeof(TSourceValue));
#else
            var valueConstant = value.ToConstantExpression();
#endif
            var valueLambda = Expression.Lambda <Func <TSourceValue> >(valueConstant);

            return(new CustomDataSourceTargetMemberSpecifier <TSource, TTarget>(
                       ConfigInfo.ForSourceValueType(valueConstant.Type),
                       valueLambda));
        }
Пример #24
0
        private void ThrowIfRedundantSourceMember(ConfiguredLambdaInfo valueLambdaInfo, QualifiedMember targetMember)
        {
            if (!valueLambdaInfo.IsSourceMember(out var sourceMemberLambda))
            {
                return;
            }

            var mappingData = _configInfo.ToMappingData <TSource, TTarget>();

            var targetMemberMapperData   = new ChildMemberMapperData(targetMember, mappingData.MapperData);
            var targetMemberMappingData  = mappingData.GetChildMappingData(targetMemberMapperData);
            var bestMatchingSourceMember = SourceMemberMatcher.GetMatchFor(targetMemberMappingData, out _);

            if (bestMatchingSourceMember == null)
            {
                return;
            }

            var sourceMember = sourceMemberLambda.ToSourceMember(MapperContext);

            if (!bestMatchingSourceMember.Matches(sourceMember))
            {
                return;
            }

            var targetMemberType = (targetMember.LeafMember.MemberType == MemberType.ConstructorParameter)
                ? "constructor parameter"
                : "member";

            throw new MappingConfigurationException(string.Format(
                                                        CultureInfo.InvariantCulture,
                                                        "Source member {0} will automatically be mapped to target {1} {2}, " +
                                                        "and does not need to be configured",
                                                        GetSourceMemberDescription(sourceMember),
                                                        targetMemberType,
                                                        targetMember.GetFriendlyTargetPath(_configInfo)));
        }
 internal CustomDataSourceTargetMemberSpecifier(MappingConfigInfo configInfo, LambdaExpression customValueLambda)
     : this(configInfo, ConfiguredLambdaInfo.For(customValueLambda))
 {
 }
Пример #26
0
 public static ConfiguredObjectFactory For(
     MappingConfigInfo configInfo,
     Type objectType,
     ConfiguredLambdaInfo factoryInfo)
 => new ConfiguredObjectFactory(configInfo, objectType, factoryInfo);
Пример #27
0
 public static ConfiguredObjectFactory For(MappingConfigInfo configInfo, Type objectType, LambdaExpression factory)
 => For(configInfo, objectType, ConfiguredLambdaInfo.For(factory));