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"); }
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>[]>(); }
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"); }
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"); }
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"); }
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(); }
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"); }
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)); }
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); }