C# extension methods for NameValueCollection class.

using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Configuration;
using System.Linq;

namespace Exceptionless.Core.Extensions
{
    public static class NameValueCollectionExtensions
    {
        public static string GetValue(this NameValueCollection collection, string name, string defaultValue = null)
        {
            return collection[name] ?? defaultValue;
        }

        public static int? GetInt(this NameValueCollection collection, string name)
        {
            var value = collection[name];
            if (value == null)
            {
                return null;
            }

            int number;
            if (Int32.TryParse(value, out number))
            {
                return number;
            }

            return null;
        }

        public static int GetInt(this NameValueCollection collection, string name, int defaultValue)
        {
            return GetInt(collection, name) ?? defaultValue;
        }

        public static long GetInt64(this NameValueCollection collection, string name, long defaultValue)
        {
            return GetInt64(collection, name) ?? defaultValue;
        }

        public static long? GetInt64(this NameValueCollection collection, string name)
        {
            var value = collection[name];
            if (value == null)
            {
                return null;
            }

            long number;
            if (Int64.TryParse(value, out number))
            {
                return number;
            }

            return null;
        }

        public static bool? GetBool(this NameValueCollection collection, string name)
        {
            string value = collection[name];
            if (value == null)
            {
                return null;
            }

            bool boolean;
            if (Boolean.TryParse(value, out boolean))
            {
                return boolean;
            }

            return null;
        }

        public static bool GetBool(this NameValueCollection collection, string name, bool defaultValue)
        {
            return GetBool(collection, name) ?? defaultValue;
        }

        public static T GetEnum<T>(this NameValueCollection collection, string name, T ? defaultValue = null) where T: struct
        {
            string value = GetValue(collection, name);
            if (value == null)
            {
                if (defaultValue.HasValue && defaultValue is T)
                {
                    return (T)defaultValue;
                }

                throw new ConfigurationErrorsException(
                    $"The configuration key '{name}' was not found and no default value was specified.");
            }

            try
            {
                return (T)Enum.Parse(typeof(T), value, true);
            }
            catch (ArgumentException ex)
            {
                if (defaultValue.HasValue && defaultValue is T)
                {
                    return (T)defaultValue;
                }

                string message = $"Configuration key '{name}' has value '{value}' that could not be parsed as a member of the {typeof(T).Name} enum type.";
                throw new ConfigurationErrorsException(message, ex);
            }
        }

        public static List<string> GetStringList(this NameValueCollection collection, string name, string defaultValues = null,
                char[] separators = null)
        {
            string value = collection[name];
            if (value == null && defaultValues == null)
            {
                return null;
            }

            if (value == null)
            {
                value = defaultValues;
            }

            if (separators == null)
                separators = new[] { ',' };

            return value
                   .Split(separators, StringSplitOptions.RemoveEmptyEntries)
                   .Select(s => s.Trim())
                   .ToList();
        }
    }
}