示例#1
0
        // 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"));
        }
示例#3
0
        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);
        }
示例#6
0
        /// <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)));
 }