public static DynamicMetaObject /*!*/ Bind(string /*!*/ methodName, CallInfo /*!*/ callInfo, DynamicMetaObjectBinder /*!*/ binder, DynamicMetaObject /*!*/ target, DynamicMetaObject /*!*/[] /*!*/ args, Func <DynamicMetaObject, DynamicMetaObject[], DynamicMetaObject> /*!*/ fallback) { Debug.Assert(fallback != null); //create DMO var phpInvokeBinder = Binder.MethodCall(methodName, 0, callInfo.ArgumentCount, null, Types.Object[0]) as PhpBaseInvokeMemberBinder; if (phpInvokeBinder != null) { //Add ScriptContext.CurrentContext var context = new DynamicMetaObject(Expression.Call(Methods.ScriptContext.GetCurrentContext), BindingRestrictions.Empty); var restrictions = BinderHelper.GetSimpleInvokeRestrictions(target, args); //Value type arguments have to be boxed DynamicMetaObject[] arguments = new DynamicMetaObject[1 + args.Length]; arguments[0] = context; for (int i = 0; i < args.Length; ++i) { arguments[1 + i] = new DynamicMetaObject(WrapDynamic(args[i].Expression), args[i].Restrictions); } var result = phpInvokeBinder.Bind(target, arguments); //Unwrap result var res = new DynamicMetaObject(Unwrap(result.Expression), restrictions); return(res); } else { return(fallback(target, args));//this will never happen } }