Example #1
0
        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);
        }
Example #2
0
        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);
        }
Example #3
0
 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);
 }
Example #4
0
        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());
            }
        }
Example #5
0
        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);
        }