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