/// <summary> /// Tries to parse the string into an object of the type this instance represents. /// Returns false when no suitable TryParse methods exists for the type or when parsing fails /// for any reason. When possible, this method uses CultureInfo.InvariantCulture and NumberStyles.Any. /// </summary> /// <param name="s">The s.</param> /// <param name="result">The result.</param> /// <returns><c>true</c> if parse was converted successfully; otherwise, <c>false</c>.</returns> public bool TryParse(string s, out object result) { result = GetDefault(); try { if (Type == typeof(string)) { result = Convert.ChangeType(s, Type); return(true); } if ((IsNullableValueType && string.IsNullOrEmpty(s)) || !CanParseNatively) { return(true); } // Build the arguments of the TryParse method var dynamicArguments = new List <object> { s }; for (var pi = 1; pi < _tryParseParameters.Length - 1; pi++) { var argInfo = _tryParseParameters[pi]; if (argInfo.ParameterType == typeof(IFormatProvider)) { dynamicArguments.Add(CultureInfo.InvariantCulture); } else if (argInfo.ParameterType == typeof(NumberStyles)) { dynamicArguments.Add(NumberStyles.Any); } else { dynamicArguments.Add(null); } } dynamicArguments.Add(null); var parseArguments = dynamicArguments.ToArray(); if ((bool)TryParseMethodInfo.Invoke(null, parseArguments)) { result = parseArguments[parseArguments.Length - 1]; return(true); } } catch { // Ignore } return(false); }