示例#1
0
        public Delegate MakeExpressionProc(int argCount)
        {
            var args = new ParameterExpression[argCount];

            for (var i = 0; i < argCount; ++i)
            {
                args[i] = Expression.Parameter(typeof(object));
            }
            var code = AccessorLambdaMetaObject.MakeExpression(Nullable, Members, args);
            var proc = Runtime.CompileToDelegate(code, args);

            return(proc);
        }
示例#2
0
        object IApply.Apply(object[] args)
        {
            if (args.Length > 6)
            {
                var args2 = args.Select(x => (Expression)Expression.Constant(x)).ToArray();
                var expr  = AccessorLambdaMetaObject.MakeExpression(Nullable, Members, args2);
                var proc  = Runtime.CompileToFunction(expr);
                var val   = proc();
                return(val);
            }
            else
            {
                switch (args.Length)
                {
                case 0:
                {
                    if (Proc0 == null)
                    {
                        Proc0 = (Func <object>)MakeExpressionProc(0);
                    }
                    return(Proc0());
                }

                case 1:
                {
                    if (Proc1 == null)
                    {
                        Proc1 = (Func <object, object>)MakeExpressionProc(1);
                    }
                    return(Proc1(args[0]));
                }

                case 2:
                {
                    if (Proc2 == null)
                    {
                        Proc2 = (Func <object, object, object>)MakeExpressionProc(2);
                    }
                    return(Proc2(args[0], args[1]));
                }

                case 3:
                {
                    if (Proc3 == null)
                    {
                        Proc3 = (Func <object, object, object, object>)MakeExpressionProc(3);
                    }
                    return(Proc3(args[0], args[1], args[2]));
                }

                case 4:
                {
                    if (Proc4 == null)
                    {
                        Proc4 = (Func <object, object, object, object, object>)MakeExpressionProc(4);
                    }
                    return(Proc4(args[0], args[1], args[2], args[3]));
                }

                case 5:
                {
                    if (Proc5 == null)
                    {
                        Proc5 = (Func <object, object, object, object, object, object>)MakeExpressionProc(1);
                    }
                    return(Proc5(args[0], args[1], args[2], args[3], args[4]));
                }

                case 6:
                {
                    if (Proc6 == null)
                    {
                        Proc6 = (Func <object, object, object, object, object, object, object>)MakeExpressionProc(6);
                    }
                    return(Proc6(args[0], args[1], args[2], args[3], args[4], args[5]));
                }

                default:
                {
                    throw new NotImplementedException("Apply supports up to 6 arguments");
                }
                }
            }
        }