/// <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); }
/// <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); }