// ReSharper disable once SuggestBaseTypeForParameter /// <code> /// context{i} => behavior.Invoke(context{i}, context{i+1} => previous) /// </code>> static Delegate CreateBehaviorCallDelegate(IBehavior currentBehavior, MethodInfo methodInfo, ParameterExpression outerContextParam, Delegate previous, List <Expression> expressions = null) { var body = ExpressionInfo.Call(ExpressionInfo.Constant(currentBehavior), methodInfo, outerContextParam, ExpressionInfo.Constant(previous)); var lambdaExpression = ExpressionInfo.Lambda(body, outerContextParam); expressions?.Add(lambdaExpression.ToExpression()); return(lambdaExpression.CompileFast()); }
public void Can_assign_to_parameter_via_ExpressionInfo() { var sParamExpr = Parameter(typeof(string), "s"); var expr = ExpressionInfo.Lambda <Func <string, string> >( ExpressionInfo.Assign(sParamExpr, ExpressionInfo.Constant("aaa")), sParamExpr); var f = expr.TryCompile(); Assert.IsNotNull(f); Assert.AreEqual("aaa", f("ignored")); }
public object CreateExpressionInfo_and_FastCompile() { //Expression<Func<Action<string>>> expr = () => a => s.SetValue(a); var aParam = Expression.Parameter(typeof(string), "a"); var expr = ExpressionInfo.Lambda( ExpressionInfo.Lambda( ExpressionInfo.Call(ExpressionInfo.Constant(_s), _setValueMethod, aParam), aParam ) ); return(expr.TryCompile <Func <Action <string> > >()); }
public void Nested_Action_using_outer_parameter_and_closed_value() { var s = new S(); //Expression<Func<Action<string>>> expr = () => a => s.SetValue(a); var aParam = Expression.Parameter(typeof(string), "a"); var expr = ExpressionInfo.Lambda( ExpressionInfo.Lambda( ExpressionInfo.Call( ExpressionInfo.Constant(s), typeof(S).GetTypeInfo().DeclaredMethods.First(m => m.Name == nameof(S.SetValue)), aParam), aParam) ); var f = ExpressionCompiler.TryCompile <Func <Action <string> > >(expr); f()("a"); Assert.AreEqual("a", s.Value); }
public static ExpressionInfo <Func <object[], object> > CreateComplexExpressionInfo() { var stateParamExpr = Expression.Parameter(typeof(object[])); var expr = ExpressionInfo.Lambda <Func <object[], object> >( ExpressionInfo.MemberInit( ExpressionInfo.New(_ctorOfA, ExpressionInfo.New(_ctorOfB), ExpressionInfo.Convert( ExpressionInfo.ArrayIndex(stateParamExpr, ExpressionInfo.Constant(11)), typeof(string)), ExpressionInfo.NewArrayInit(typeof(ID[]), ExpressionInfo.New(_ctorOfD1), ExpressionInfo.New(_ctorOfD2))), ExpressionInfo.Bind(_propAProp, ExpressionInfo.New(_ctorOfP, ExpressionInfo.New(_ctorOfB))), ExpressionInfo.Bind(_fieldABop, ExpressionInfo.New(_ctorOfB))), stateParamExpr); return(expr); }
/// <code> /// context{i} => return TaskEx.CompletedTask; /// </code>> static Delegate CreateDoneDelegate(Type inContextType, int i) { var innerContextParam = ExpressionInfo.Parameter(inContextType, $"context{i + 1}"); return(ExpressionInfo.Lambda(ExpressionInfo.Constant(Task.CompletedTask), innerContextParam).CompileFast()); }
public object NewExpressionInfo() { return(ExpressionInfo.New(_xCtor, ExpressionInfo.Constant(_y))); }