/// <summary> /// /// </summary> /// <param name="context"></param> /// <param name="args">Ignored for strongly bound objects (null should be passed)</param> /// <returns></returns> public object Invoke(IScriptContext context, object[] args) { //object result = RuntimeHost.NullValue; //if (args != null) //{ // if (Target == null && !Method.IsStatic) // result = Method.Invoke(args.First(), args.Skip(1).ToArray()); // else // result = Method.Invoke(Target, args); //} //else //{ // result = Method.Invoke(Target, Arguments); //} //context.Result = result; //return result; if (args != null) { Arguments = args; } //NOTE: ref, out object[] callArguments = new object[Arguments.Length]; for (int i = 0; i < callArguments.Length; i++) { ScopeValueReference vr = Arguments[i] as ScopeValueReference; if (vr != null) { callArguments[i] = vr.ConvertedValue; continue; } FunctionDelegate d = Arguments[i] as FunctionDelegate; if (d != null) { d.ActiveContext = context; callArguments[i] = d.Method; continue; } callArguments[i] = Arguments[i]; } var result = Method.Invoke(Target, callArguments); //NOTE: ref, out for (var i = 0; i < callArguments.Length; i++) { var vr = Arguments[i] as ScopeValueReference; if (vr != null) { vr.Value = callArguments[i]; } } return(result); }
protected static object[] ComposeParameters(object[] arguments, ParameterInfo[] parameters, CanConvertTypePredicate predicate, ConvertTypeMethod converter) { if (arguments.Length != parameters.Length) { return(null); } var result = new object[arguments.Length]; for (int i = 0; i < parameters.Length; i++) { var parameterType = parameters[i].ParameterType; var argument = arguments[i]; //NOTE: ref, out //out and ref parameters handling ScopeValueReference vr = null; if (parameters[i].ParameterType.IsByRef) { vr = (ScopeValueReference)argument; argument = vr.Value; } if (predicate(argument, parameterType)) { var converted = converter(argument, parameterType); if (converted == NoResult) { return(null); } //NOTE: ref, out if (vr == null) { result[i] = converted; } else { vr.ConvertedValue = converted; result[i] = vr; } } else { return(null); } } return(result); }