/// <summary>
        /// Provides culture-invariant parsing of int, double, float, bool, and enum values.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="value"></param>
        /// <param name="defaultValue"></param>
        /// <returns></returns>
        public static T?ParsePrimitive <T>(string value, T?defaultValue) where T : struct, IConvertible
        {
            if (value == null)
            {
                return(defaultValue);
            }
            value = value.Trim();
            if (value.Length == 0)
            {
                return(defaultValue);
            }
            Type type = typeof(T);

            if (type == typeof(byte))
            {
                byte result = 0;
                if (byte.TryParse(value, NumberStyles.Integer, (IFormatProvider)NumberFormatInfo.InvariantInfo, out result))
                {
                    return((ValueType)result as T?);
                }
            }
            else if (type == typeof(int))
            {
                int result = 0;
                if (int.TryParse(value, NumberStyles.Integer, (IFormatProvider)NumberFormatInfo.InvariantInfo, out result))
                {
                    return((ValueType)result as T?);
                }
            }
            else if (type == typeof(double))
            {
                double result = 0.0;
                if (double.TryParse(value, NameValueCollectionExtensions.floatingPointStyle, (IFormatProvider)NumberFormatInfo.InvariantInfo, out result))
                {
                    return((ValueType)result as T?);
                }
            }
            else if (type == typeof(float))
            {
                float result = 0.0f;
                if (float.TryParse(value, NameValueCollectionExtensions.floatingPointStyle, (IFormatProvider)NumberFormatInfo.InvariantInfo, out result))
                {
                    return((ValueType)result as T?);
                }
            }
            else if (type == typeof(bool))
            {
                string str = value;
                if ("true".Equals(str, StringComparison.OrdinalIgnoreCase) || "1".Equals(str, StringComparison.OrdinalIgnoreCase) || ("yes".Equals(str, StringComparison.OrdinalIgnoreCase) || "on".Equals(str, StringComparison.OrdinalIgnoreCase)))
                {
                    return((ValueType)true as T?);
                }
                if ("false".Equals(str, StringComparison.OrdinalIgnoreCase) || "0".Equals(str, StringComparison.OrdinalIgnoreCase) || ("no".Equals(str, StringComparison.OrdinalIgnoreCase) || "off".Equals(str, StringComparison.OrdinalIgnoreCase)))
                {
                    return((ValueType)false as T?);
                }
            }
            else if (type.IsEnum)
            {
                T?nullable = EnumExtensions.Parse <T>(value);
                if (nullable.HasValue)
                {
                    return(nullable);
                }
            }
            else
            {
                T?nullable = value as T?;
                if (nullable.HasValue)
                {
                    return(nullable);
                }
            }
            return(defaultValue);
        }
Exemplo n.º 2
0
 /// <summary>
 /// Attempts case-insensitive parsing of the specified enum. Returns null if parsing failed.
 /// Supports [EnumString("Alternate Value")] attributes and parses flags. If any segment of a comma-delimited list isn't parsed as either a number or string, null will be returned.
 /// </summary>
 /// <param name="en"></param>
 /// <param name="value"></param>
 /// <returns></returns>
 public static T?Parse <T>(this T en, string value) where T : struct, IConvertible
 {
     return(EnumExtensions.Parse <T>(value));
 }