Exemplo n.º 1
0
        public void gets_anonmous_wrapped_expression()
        {
            var obj = new
            {
                dooda = new
                {
                    it = new Person
                    {
                        Addresses = new[]
                        {
                            new Address()
                        }
                    }
                }
            };

            var exp = (Expression <Func <IEnumerable <Address> > >)
                          (() => obj.dooda.it.Addresses);

            var sut = new CollapseMembersExpressionVisitor();

            var result = sut.Modify(exp);

            Assert.Equal("Addresses", result.Member.Name);
            Assert.Equal(obj.dooda.it, result.Subject);
        }
Exemplo n.º 2
0
        /// <summary>
        ///   <para> Map an object </para>
        /// </summary>
        /// <typeparam name="TFrom"> Type to map from </typeparam>
        /// <typeparam name="TTo"> Type to map to </typeparam>
        /// <param name="from"> Object to map from </param>
        /// <param name="toExpression"> Expression for the target </param>
        /// <param name="context"> Context </param>
        public void Map <TFrom, TTo>(
            TFrom from,
            Expression <Func <TTo> > toExpression,
            IMapperContext context)
            where TTo : class
        {
            if (toExpression == null)
            {
                throw new ArgumentNullException("toExpression");
            }
            if (Equals(from, default(TFrom)))
            {
                return;
            }

            var toMember
                = new CollapseMembersExpressionVisitor()
                  .Modify(toExpression);
            var to = toMember.GetValue();

            if (to == null)
            {
                to = context.Create <TTo>();

                toMember.SetValue(to);
            }

            var mapper = Get <TFrom, TTo>();

            mapper(from, to, context);

            context.Update(to);
        }
Exemplo n.º 3
0
        public void gets_anonmous_wrapped_expression()
        {
            var obj = new
                          {
                              dooda = new
                                          {
                                              it = new Person
                                                       {
                                                           Addresses = new[]
                                                                           {
                                                                               new Address()
                                                                           }
                                                       }
                                          }
                          };

            var exp = (Expression<Func<IEnumerable<Address>>>)
                      (() => obj.dooda.it.Addresses);

            var sut = new CollapseMembersExpressionVisitor();

            var result = sut.Modify(exp);

            Assert.Equal("Addresses", result.Member.Name);
            Assert.Equal(obj.dooda.it, result.Subject);
        }
Exemplo n.º 4
0
        public void fails_with_lambda_invoke()
        {
            var obj = new Person
            {
                Addresses = new[]
                {
                    new Address()
                }
            };
            var lambda = (Func <IEnumerable <Address> >)
                             (() => obj.Addresses);

            var exp = (Expression <Func <IEnumerable <Address> > >)
                          (() => lambda());

            var sut = new CollapseMembersExpressionVisitor();

            var ex = Assert.Throws <NotSupportedException>(() => sut.Modify(exp));
        }
Exemplo n.º 5
0
        public void fails_with_lambda_invoke()
        {
            var obj = new Person
                          {
                              Addresses = new[]
                                              {
                                                  new Address()
                                              }
                          };
            var lambda = (Func<IEnumerable<Address>>)
                         (() => obj.Addresses);

            var exp = (Expression<Func<IEnumerable<Address>>>)
                      (() => lambda());

            var sut = new CollapseMembersExpressionVisitor();

            var ex = Assert.Throws<NotSupportedException>(() => sut.Modify(exp));
        }
Exemplo n.º 6
0
        public void gets_simple_expression_with_interfaces()
        {
            var obj = (IPerson) new Person
            {
                Addresses = new[]
                {
                    new Address()
                }
            };

            var exp = (Expression <Func <IEnumerable <IAddress> > >)
                          (() => obj.Addresses);

            var sut = new CollapseMembersExpressionVisitor();

            var result = sut.Modify(exp);

            Assert.Equal("Addresses", result.Member.Name);
            Assert.Equal(obj, result.Subject);
        }
Exemplo n.º 7
0
        public void gets_simple_expression()
        {
            var obj = new Person
                          {
                              Addresses = new[]
                                              {
                                                  new Address()
                                              }
                          };

            var exp = (Expression<Func<IEnumerable<Address>>>)
                      (() => obj.Addresses);

            var sut = new CollapseMembersExpressionVisitor();

            var result = sut.Modify(exp);

            Assert.Equal("Addresses", result.Member.Name);
            Assert.Equal(obj, result.Subject);
        }
Exemplo n.º 8
0
        /// <summary>
        ///   <para> Map all items </para>
        /// </summary>
        /// <typeparam name="TFrom"> Type to map from </typeparam>
        /// <typeparam name="TTo"> Type to map to </typeparam>
        /// <param name="from"> Object enumerable to map from </param>
        /// <param name="toExpression"> Object collection to map to </param>
        /// <param name="match"> Match function to find objects in the 'to' items given a 'from' item </param>
        /// <param name="context"> Context </param>
        public void MapAll <TFrom, TTo>(
            IEnumerable <TFrom> from,
            Expression <Func <IEnumerable <TTo> > > toExpression,
            Func <TFrom, TTo, bool> match,
            IMapperContext context)
            where TTo : class
        {
            if (toExpression == null)
            {
                throw new ArgumentNullException("toExpression");
            }
            if (from == null)
            {
                return;
            }

            var toMember
                = new CollapseMembersExpressionVisitor()
                  .Modify(toExpression);

            var toOriginal = toMember.GetValue();
            var toItemType = GetEnumerableElementType(toMember.Type);

            var toList = toOriginal as IList;

            if (toOriginal == null ||
                toList == null ||
                toList.IsFixedSize || toList.IsReadOnly)
            {
                // create a new member list when null or readonly
                toList = (IList)
                         (Implements(toMember.Type, typeof(IList)) &&
                          !toMember.Type.IsArray
                              ? Activator.CreateInstance(toMember.Type)
                              : Activator.CreateInstance(
                              typeof(Collection <>).MakeGenericType(new[] { toItemType }))
                         );

                // set it to the member, knowing it is an IEnumerable<TTo>
                toMember.SetValue((IEnumerable <TTo>)toList);
            }

            // get original 'to' items for matching, and clear from member list
            var toListOriginal = toOriginal == null
                                     ? new List <TTo>()
                                     : toOriginal.ToList();

            toList.Clear();

            // prepare to map each 'from' item
            var fromItemType = typeof(TFrom);
            var mapper       = Get(fromItemType, toItemType);
            var mapperMethod = mapper.GetType().GetMethod("Invoke");

            foreach (var fromItem in from)
            {
                // find the 'to' item or create one
                var toItem = default(TTo);
                if (match != null)
                {
                    toItem = toListOriginal
                             .SingleOrDefault(t => match(fromItem, t));

                    toListOriginal.Remove(toItem);
                }

                if (toItem == null)
                {
                    toItem = context.Create <TTo>();
                }

                // map
                mapperMethod.Invoke(mapper,
                                    new object[] { fromItem, toItem, context });

                toList.Add(toItem);

                context.Update(toItem);
            }

            if (!toListOriginal.Any())
            {
                return;
            }

            foreach (var toItem in toListOriginal)
            {
                context.Delete(toItem);
            }
        }