Beispiel #1
0
        public static TDestinationElement[] Map <TSource, TSourceElement, TDestinationElement>(TSource source, ResolutionContext context)
            where TSource : IEnumerable
        {
            if (source == null)
            {
                return(context.Mapper.ShouldMapSourceCollectionAsNull(context) ? null : new TDestinationElement[0]);
            }

            if (context.DestinationType.IsAssignableFrom(context.SourceType))
            {
                var elementTypeMap = context.ConfigurationProvider.ResolveTypeMap(typeof(TSourceElement), typeof(TDestinationElement));
                if (elementTypeMap == null)
                {
                    return(source as TDestinationElement[]);
                }
            }

            var itemContext = new ResolutionContext(context);

            return(source.Cast <TSourceElement>()
                   .Select(item => (TDestinationElement)itemContext.Map(item, null, typeof(TSourceElement), typeof(TDestinationElement)))
                   .ToArray());
        }
        private static Array Map <TDestination, TSource, TSourceElement>(TSource source, ResolutionContext context, IConfigurationProvider configurationProvider)
            where TSource : IEnumerable
        {
            var sourceArray     = source as Array;
            var destElementType = ElementTypeHelper.GetElementType(typeof(TDestination));

            if (typeof(TDestination).IsAssignableFrom(typeof(TSource)))
            {
                var elementTypeMap = configurationProvider.ResolveTypeMap(typeof(TSourceElement), destElementType);
                if (elementTypeMap == null)
                {
                    return(sourceArray);
                }
            }
            var destinationArray = Array.CreateInstance(destElementType, Enumerable.Range(0, sourceArray.Rank).Select(sourceArray.GetLength).ToArray());
            var filler           = new MultidimensionalArrayFiller(destinationArray);

            foreach (var item in source)
            {
                filler.NewValue(context.Map(item, null, typeof(TSourceElement), destElementType, null));
            }
            return(destinationArray);
        }
        public static object Map(this ResolutionContext context, MemberInfo member, object value)
        {
            var memberType = member.GetMemberType();

            return(context.Map(value, null, value?.GetType() ?? memberType, memberType));
        }