示例#1
0
        public void ShouldReplaceWhenVisitMethodCallStatic()
        {
            // Given
            Expression <Func <TT> > expression = () => (TT)(object)MyClass.StaticGetString("abc");
            var typesMap         = CreateTypesMap(expression.ReturnType, typeof(string));
            var replacingVisitor = new TypeReplacerExpressionVisitor(typesMap);

            // When
            var expressionExpression = replacingVisitor.Visit(expression.Body);
            var func = Expression.Lambda <Func <string> >(expressionExpression).Compile();

            // Then
            func().ShouldBe("abc");
        }
示例#2
0
        public void ShouldReplaceWhenArrayExpressionAndGenericAndConvertExpression()
        {
            // Given
            Expression <Func <List <TTT>[]> > expression = () => new[] { new List <TTT>() }.ToArray();
            var typesMap = CreateTypesMap(expression.ReturnType, typeof(List <MyClass>[]));
            var replacingVisitor = new TypeReplacerExpressionVisitor(typesMap);

            // When
            var expressionExpression = replacingVisitor.Visit(expression.Body);
            var func = Expression.Lambda <Func <List <MyClass>[]> >(expressionExpression).Compile();

            // Then
            func().ShouldBeOfType <List <MyClass>[]>();
        }
示例#3
0
        public void ShouldReplaceWhenNewExpressionAndConvertExpression()
        {
            // Given
            Expression <Func <Tuple <TT> > > expression = () => new Tuple <TT>((TT)(object)"abc");
            var typesMap         = CreateTypesMap(expression.ReturnType, typeof(Tuple <string>));
            var replacingVisitor = new TypeReplacerExpressionVisitor(typesMap);

            // When
            var expressionExpression = replacingVisitor.Visit(expression.Body);
            var func = Expression.Lambda <Func <Tuple <string> > >(expressionExpression).Compile();

            // Then
            func().Item1.ShouldBe("abc");
        }
示例#4
0
        public void ShouldReplaceWhenVisitArray()
        {
            // Given
            Expression <Func <TT[]> > expression = () => new[] { (TT)(object)"abc" };
            var typesMap         = CreateTypesMap(expression.ReturnType, typeof(string[]));
            var replacingVisitor = new TypeReplacerExpressionVisitor(typesMap);

            // When
            var expressionExpression = replacingVisitor.Visit(expression.Body);
            var func = Expression.Lambda <Func <string[]> >(expressionExpression).Compile();

            // Then
            func()[0].ShouldBe("abc");
        }
示例#5
0
        public void ShouldReplaceWhenVisitPropertyMember()
        {
            // Given
            Expression <Func <TT> > expression = () => new MyClass2 <TT>((TT)(object)"abc").Prop;
            var typesMap         = CreateTypesMap(expression.ReturnType, typeof(string));
            var replacingVisitor = new TypeReplacerExpressionVisitor(typesMap);

            // When
            var expressionExpression = replacingVisitor.Visit(expression.Body);
            var func = Expression.Lambda <Func <string> >(expressionExpression).Compile();

            // Then
            func().ShouldBe("abc");
        }
示例#6
0
        public void ShouldReplaceWhenVisitStaticMember()
        {
            // Given
            Expression <Func <Pool <TT> > > expression = () => Pool <TT> .Shared;
            var typesMap         = CreateTypesMap(expression.ReturnType, typeof(Pool <byte>));
            var replacingVisitor = new TypeReplacerExpressionVisitor(typesMap);

            // When
            var expressionExpression = replacingVisitor.Visit(expression.Body);
            var func = Expression.Lambda <Func <Pool <byte> > >(expressionExpression).Compile();

            // Then
            func();
        }
示例#7
0
        public void ShouldReplaceWhenVisitLambda()
        {
            // Given
            // ReSharper disable once RedundantDelegateCreation
            Expression <Func <Func <TT> > > expression = () => new Func <TT>(() => (TT)(object)"abc");
            var typesMap         = CreateTypesMap(expression.ReturnType, typeof(Func <string>));
            var replacingVisitor = new TypeReplacerExpressionVisitor(typesMap);

            // When
            var expressionExpression = replacingVisitor.Visit(expression.Body);
            var func = Expression.Lambda <Func <Func <string> > >(expressionExpression).Compile();

            // Then
            func()().ShouldBe("abc");
        }
示例#8
0
        public void ShouldReplaceWhenTypeConstantExpression()
        {
            // Given
            Expression <Func <Type> > expression = () => typeof(TT);
            var typesMap = new Dictionary <Type, Type> {
                { typeof(TT), typeof(string) }
            };
            var replacingVisitor = new TypeReplacerExpressionVisitor(typesMap);

            // When
            var expressionExpression = replacingVisitor.Visit(expression.Body);
            var func = Expression.Lambda <Func <Type> >(expressionExpression).Compile();

            // Then
            func().ShouldBe(typeof(string));
        }
示例#9
0
        private static Expression ReplaceTypes(IBuildContext buildContext, Expression expression, IDictionary <Type, Type> typesMap)
        {
            typesMap = typesMap ?? new Dictionary <Type, Type>();
            if (expression.Type == buildContext.Key.Type)
            {
                return(expression);
            }

            TypeMapper.Shared.Map(expression.Type, buildContext.Key.Type, typesMap);
            if (typesMap.Count == 0)
            {
                return(expression);
            }

            var visitor = new TypeReplacerExpressionVisitor(typesMap);

            return(visitor.Visit(expression) ?? expression);
        }