/// <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(); //Trim whitespace
            if (value.Length == 0)
            {
                return(defaultValue);
            }

            Type t = typeof(T);

            if (t == typeof(byte))
            {
                byte temp = 0;
                if (byte.TryParse(value, NumberStyles.Integer, NumberFormatInfo.InvariantInfo, out temp))
                {
                    return(temp as T?);
                }
            }
            else if (t == typeof(int))
            {
                int temp = 0;
                if (int.TryParse(value, NumberStyles.Integer, NumberFormatInfo.InvariantInfo, out temp))
                {
                    return(temp as T?);
                }
            }
            else if (t == typeof(double))
            {
                double temp = 0;
                if (double.TryParse(value, floatingPointStyle, NumberFormatInfo.InvariantInfo, out temp))
                {
                    return(temp as T?);
                }
            }
            else if (t == typeof(float))
            {
                float temp = 0;
                if (float.TryParse(value, floatingPointStyle, NumberFormatInfo.InvariantInfo, out temp))
                {
                    return(temp as T?);
                }
            }
            else if (t == typeof(bool))
            {
                string s = value;
                if ("true".Equals(s, StringComparison.OrdinalIgnoreCase) ||
                    "1".Equals(s, StringComparison.OrdinalIgnoreCase) ||
                    "yes".Equals(s, StringComparison.OrdinalIgnoreCase) ||
                    "on".Equals(s, StringComparison.OrdinalIgnoreCase))
                {
                    return(true as T?);
                }
                else if ("false".Equals(s, StringComparison.OrdinalIgnoreCase) ||
                         "0".Equals(s, StringComparison.OrdinalIgnoreCase) ||
                         "no".Equals(s, StringComparison.OrdinalIgnoreCase) ||
                         "off".Equals(s, StringComparison.OrdinalIgnoreCase))
                {
                    return(false as T?);
                }
            }
            else if (t.IsEnum)
            {
                T?val = EnumExtensions.Parse <T>(value); //Support EnumString values
                if (val.HasValue)
                {
                    return(val);
                }
            }
            else
            {
                T?val = value as T?;   //Just try casting
                if (val.HasValue)
                {
                    return(val);
                }
            }

            return(defaultValue);
        }
Exemple #2
0
        /// <summary>
        /// Attempts case-insensitive parsing of the specified enum. Returns the specified default value if parsing fails.
        /// 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, defaultValue will be returned.
        /// </summary>
        /// <param name="en"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        public static T Parse <T>(T en, string value, T defaultValue) where T : struct, IConvertible
        {
            T?val = EnumExtensions.Parse <T>(en, value);

            return(val == null ? defaultValue : val.Value);
        }