public void Visit_ExpressionSubClassCheckIfNull_DefaultValueConstant_ReturnExpression()
        {
            MapperExpressionVisitor expected             = new MapperExpressionVisitor(Expression.Parameter(typeof(ClassSource), "s"));
            Expression <Func <ClassSource, object> > exp = x => x.SubClass.PropInt1;

            var actual = expected.Visit(exp, true);

            Assert.IsTrue(actual.NodeType == ExpressionType.MemberAccess);
        }
        public void Visit_ExpressionMemberSimple_ReturnExpression()
        {
            MapperExpressionVisitor expected             = new MapperExpressionVisitor(Expression.Parameter(typeof(ClassSource), "s"));
            Expression <Func <ClassSource, object> > exp = x => x.PropString1;

            var actual = expected.Visit(exp.Body, true);

            Assert.IsNotNull(actual);
        }
        public void Visit_ExpressionLambdaConstantSimple_ReturnExpression()
        {
            MapperExpressionVisitor expected             = new MapperExpressionVisitor(Expression.Parameter(typeof(ClassSource), "s"));
            Expression <Func <ClassSource, object> > exp = x => x.PropInt1;

            var actual = expected.Visit(exp, true);

            Assert.IsNotNull(actual);
        }
        public void Visit_ExpressionIsNull_ReturnNull()
        {
            MapperExpressionVisitor expected = new MapperExpressionVisitor(Expression.Parameter(typeof(ClassSource), "s"));
            Expression exp = null;

            var actual = expected.Visit(exp);

            Assert.IsNull(actual);
        }
        public void Visit_ParameterExpression_CheckIfNull_IsTrue_Expression()
        {
            MapperExpressionVisitor expected = new MapperExpressionVisitor(Expression.Parameter(typeof(ClassSource), "s"));
            ParameterExpression     exp      = Expression.Parameter(typeof(ClassSource2), "x");

            Expression actual = expected.Visit(exp, true) as ParameterExpression;

            Assert.IsTrue(actual.NodeType == ExpressionType.Parameter);
            Assert.AreNotEqual(actual.Type, exp.Type);
        }
 /// <summary>
 /// 构造函数
 /// </summary>
 /// <param name="source">源类型</param>
 /// <param name="destination">目标类型</param>
 /// <param name="paramName">属性名</param>
 /// <param name="name">别名</param>
 protected MapperConfigurationBase(Type source, Type destination, string paramName, string name = null)
 {
     TargetType = destination;
     SourceType = source;
     paramClassSource = Expression.Parameter(source, paramName);
     Name = string.IsNullOrEmpty(name) ? paramName : name;
     _propertiesToIgnore = new List<PropertyInfo>();
     PropertiesMapping = new List<Tuple<Expression, Expression, bool, string>>();
     visitorMapper = new MapperExpressionVisitor(paramClassSource);
     memberForNew = new List<MemberAssignment>();
     _selectMethod = typeof(Enumerable).GetMethods().Where(m => m.Name == "Select").Select(x => x.GetParameters().First(p => p.Name.Equals("selector") && p.ParameterType.GetGenericArguments().Length == 2)).First().Member as MethodInfo;
     _toListMethod = typeof(Enumerable).GetMethod("ToList");
 }
        /// <summary>
        /// 获取排序表达式树
        /// </summary>
        /// <param name="propertySource">属性名</param>
        /// <returns></returns>
        public LambdaExpression GetSortedExpression(string propertySource)
        {
            var exp = PropertiesMapping.Find(x => GetPropertyInfo(x.Item2).Name == propertySource);
            if (exp == null)
            {
                throw new PropertyNoExistException(propertySource, TargetType);
            }

            // 更改参数
            var visitor = new MapperExpressionVisitor(paramClassSource);
            var result = visitor.Visit(exp.Item1);
            return Expression.Lambda(result, paramClassSource);
        }