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); }
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); }