/// <summary>
        /// Find a value from a System.Enum by trying several possible variants
        /// of the string value of the enum.
        /// </summary>
        /// <param name="type">Type of enum</param>
        /// <param name="value">Value for which to search</param>
        /// <param name="culture">The culture used to calculate the name variants</param>
        /// <returns></returns>
        public static object FindEnumValue(this Type type, string value, CultureInfo culture)
        {
            var caseInsensitiveComparer = StringComparer.Create(culture, true);

            Enum ret = Enum2.GetEnumValues(type)
                       //.Cast<Enum> ()
                       .FirstOrDefault(v => v.ToString()
                                       .GetNameVariants(culture)
                                       .Contains(value, caseInsensitiveComparer));

            if (ret != null)
            {
                return(ret);
            }

            var enumValueAsUnderlyingType = Convert.ChangeType(value, Enum.GetUnderlyingType(type), culture);

            if (enumValueAsUnderlyingType != null && Enum.IsDefined(type, enumValueAsUnderlyingType))
            {
                ret = (Enum)Enum.ToObject(type, enumValueAsUnderlyingType);
            }

            return(ret);
        }