Пример #1
0
        /// <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);
        }
Пример #2
0
        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);
        }