示例#1
0
        public static object CallMethod(string methodName, IList <Type> typeArgs, bool isStatic, Type t, object target, params object[] args)
        {
            Expression        targetExpr = isStatic ? Expression.Constant(t, typeof(Type)) : Expression.Constant(target);
            List <Expression> exprs      = new List <Expression>();

            foreach (object arg in args)
            {
                exprs.Add(Expression.Constant(arg));
            }

            Expression[] argExprs = ClrExtensions.ArrayInsert <Expression>(targetExpr, exprs);

            // TODO: Get rid of Default
            InvokeMemberBinder binder = new ClojureInvokeMemberBinder(ClojureContext.Default, methodName, argExprs.Length, isStatic);

            Expression dyn = Expression.Dynamic(binder, typeof(object), argExprs);

            LambdaExpression lambda = Expression.Lambda <clojure.lang.Compiler.ReplDelegate>(dyn);

            return(lambda.Compile().DynamicInvoke());
        }