Beispiel #1
0
        internal object[] ConvertArguments(Arguments arguments, ConvertArgsOptions options)
        {
            if (_parameters.Length == 0)
            {
                return(null);
            }

            if (_forceInstance)
            {
                ExceptionHelper.Throw(new InvalidOperationException());
            }

            object[] res         = null;
            int      targetCount = _parameters.Length;

            for (int i = targetCount; i-- > 0;)
            {
                var jsValue = arguments?[i] ?? undefined;

                var value = convertArgument(i, jsValue, options);

                if (value == null && !jsValue.IsNull)
                {
                    return(null);
                }

                if (res == null)
                {
                    res = new object[targetCount];
                }

                res[i] = value;
            }

            return(res);
        }
Beispiel #2
0
        private object convertArgument(int index, JSValue value, ConvertArgsOptions options)
        {
            if (_paramsConverters?[index] != null)
            {
                return(_paramsConverters[index].To(value));
            }

            var    strictConversion = options.HasFlag(ConvertArgsOptions.StrictConversion);
            var    parameterInfo    = _parameters[index];
            object result           = null;

            if (value.IsNull && parameterInfo.ParameterType.GetTypeInfo().IsClass)
            {
                return(null);
            }
            else if (value.Defined)
            {
                result = Tools.convertJStoObj(value, parameterInfo.ParameterType, !strictConversion);
                if (strictConversion && result == null)
                {
                    if (options.HasFlag(ConvertArgsOptions.ThrowOnError))
                    {
                        ExceptionHelper.ThrowTypeError("Unable to convert " + value + " to type " + parameterInfo.ParameterType);
                    }

                    if (!options.HasFlag(ConvertArgsOptions.DummyValues))
                    {
                        return(null);
                    }
                }
            }
            else
            {
                if (parameterInfo.ParameterType.IsAssignableFrom(value.GetType()))
                {
                    return(value);
                }
            }

            if (result == null &&
                (options.HasFlag(ConvertArgsOptions.DummyValues) || parameterInfo.Attributes.HasFlag(ParameterAttributes.HasDefault)))
            {
                result = parameterInfo.DefaultValue;

#if (PORTABLE || NETCORE)
                if (result != null && result.GetType().FullName == "System.DBNull")
                {
#else
                if (result is DBNull)
                {
#endif
                    if (strictConversion && options.HasFlag(ConvertArgsOptions.ThrowOnError))
                    {
                        ExceptionHelper.ThrowTypeError("Unable to convert " + value + " to type " + parameterInfo.ParameterType);
                    }

                    if (parameterInfo.ParameterType.GetTypeInfo().IsValueType)
                    {
                        result = Activator.CreateInstance(parameterInfo.ParameterType);
                    }
                    else
                    {
                        result = null;
                    }
                }
            }

            return(result);
        }