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