public static object ParseOrDefault(string str, Type targetType, bool ignoreCase = false, object defaultValue = null) { ArgCheck.NotNull(nameof(targetType), targetType); if (defaultValue != null && !targetType.IsAssignableFrom(defaultValue.GetType())) { throw new ArgumentException($"Parameter '{nameof(defaultValue)}' must be assignable to '{nameof(targetType)}'.", nameof(defaultValue)); } if (TryParse(str, targetType, out var value, ignoreCase: ignoreCase)) { return(value); } return(defaultValue); }
public static object ConvertOrDefault(object value, Type targetType, object defaultValue = null) { ArgCheck.NotNull(nameof(targetType), targetType); if (defaultValue != null && !targetType.IsAssignableFrom(defaultValue.GetType())) { throw new ArgumentException($"Parameter '{nameof(defaultValue)}' must be assignable to '{nameof(targetType)}'.", nameof(defaultValue)); } if (TryConvert(value, targetType, out var result)) { return(result); } return(defaultValue); }
public static async Task <int> CheckAndDelayForRetryAsync(int retryCount, int maxRetryCount = DefaultMaxRetryCount, TimeSpan?maxRetryDelay = null) { if (maxRetryDelay == null) { maxRetryDelay = DefaultMaxRetryDelay; } ArgCheck.GreaterThanOrEqualTo(nameof(retryCount), retryCount, 0); ArgCheck.GreaterThanOrEqualTo(nameof(maxRetryCount), maxRetryCount, 0); ArgCheck.GreaterThanOrEqualTo(nameof(maxRetryDelay), maxRetryDelay.Value, TimeSpan.Zero); if (retryCount >= maxRetryCount) { return(-1); } if (retryCount > 0) { var delay = TimeSpan.FromMilliseconds((int)Math.Pow(2, retryCount) * 100); if (delay > maxRetryDelay) { delay = maxRetryDelay.Value; } await Task.Delay(delay).ConfigureAwait(false); } return(++retryCount); }
private static byte[] GetBytesFromStrings(Encoding encoding, string[] values) { ArgCheck.NotNull(nameof(encoding), encoding); ArgCheck.NotNullOrEmpty(nameof(values), values); using (var ms = new MemoryStream()) { using (var w = new BinaryWriter(ms, encoding, true)) { w.Write(values.Length); foreach (var v in values) { w.Write(v != null); if (v != null) { w.Write(v); } } w.Flush(); } ms.Flush(); return(ms.ToArray()); } }
public static bool TryParse(string str, Type targetType, out object value, bool ignoreCase = false) { ArgCheck.NotNull(nameof(targetType), targetType); if (targetType.IsInterface || targetType.IsAbstract) // static classes are abstract (and sealed) { throw new ArgumentException($"Parameter '{nameof(targetType)}' must be a struct or a concrete instance-based class (no interfaces and no abstract or static classes).", nameof(targetType)); } // if null we can't do anything with it, return failure if (str == null) { value = null; return(false); } // if wanting type string, just return the original if (targetType == typeof(string)) { value = str; return(true); } // if blank or just whitespace we can't do anything with it, return failure if (string.IsNullOrWhiteSpace(str)) { value = null; return(false); } // remove any nullable wrapping targetType = Nullable.GetUnderlyingType(targetType) ?? targetType; // for booleans, allow case-insensitive values if (targetType == typeof(bool)) { str = str.Trim().Normalize().ToLowerInvariant(); if (_trueStringsForBooleanParsing.Contains(str)) { value = true; return(true); } if (_falseStringsForBooleanParsing.Contains(str)) { value = false; return(true); } // failed to convert to boolean value = null; return(false); } if (targetType == typeof(DateTime)) { if (DateTime.TryParse(str, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal, out var d)) { value = d; return(true); } } if (targetType == typeof(DateTimeOffset)) { if (DateTimeOffset.TryParse(str, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal, out var d)) { value = d; return(true); } } // Type - examples: // "System.String" // "System.String, mscorlib" // "System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" if (targetType == typeof(Type)) { value = Type.GetType(str); return(true); } if (targetType == typeof(Version)) { if (Version.TryParse(str, out var version)) { value = version; return(true); } value = null; return(false); } if (targetType.IsEnum) { str = EnumHelper.NormalizeName(targetType, str, ignoreCase, true); try { // enum name or underlying integral value value = Enum.Parse(targetType, str, ignoreCase); return(true); } catch { value = null; return(false); } } try { var converter = TypeDescriptor.GetConverter(targetType); if (converter != null) { value = converter.ConvertFromString(str); return(true); } } catch { } try { // fallback is to use Convert.ChangeType() value = Convert.ChangeType(str, targetType); return(true); } catch { } // failed to parse value = null; return(false); }