File: System\Configuration\GenericEnumConverter.cs
Project: ndp\fx\src\Configuration\System.Configuration.csproj (System.Configuration)
//------------------------------------------------------------------------------
// <copyright file="GenericEnumConverter.cs" company="Microsoft">
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// </copyright>
//------------------------------------------------------------------------------
 
using System;
using System.Collections;
using System.IO;
using System.Reflection;
using System.Security.Permissions;
using System.Xml;
using System.Collections.Specialized;
using System.Globalization;
using System.ComponentModel;
using System.Security;
using System.Text;
 
namespace System.Configuration {
 
    public sealed class GenericEnumConverter : ConfigurationConverterBase {
        private Type _enumType;
 
        public GenericEnumConverter(Type typeEnum) {
            if (typeEnum == null) {
                throw new ArgumentNullException("typeEnum");
            }
 
            _enumType = typeEnum;
        }
 
        public override object ConvertTo(ITypeDescriptorContext ctx, CultureInfo ci, object value, Type type) {
            Debug.Assert(typeof(System.Enum).IsAssignableFrom(value.GetType()), "typeof(System.Enum).IsAssignableFrom(value.GetType())");
 
            return value.ToString();
        }
        
        public override object ConvertFrom(ITypeDescriptorContext ctx, CultureInfo ci, object data) {
            object result = null;
            //
            // For any error, throw the ArgumentException with SR.Invalid_enum_value
            //
            try {
                string value = (string)data;
                if (String.IsNullOrEmpty(value)) {
                    throw new Exception();
                }
 
                // Disallow numeric values for enums.
                if (!String.IsNullOrEmpty(value) &&
                        (Char.IsDigit(value[0]) ||
                        (value[0] == '-') ||
                        (value[0] == '+'))) {
                    throw new Exception();
                }
 
                if (value != value.Trim()) { // throw if the value has whitespace 
                    throw new Exception();
                }
 
                result = Enum.Parse(_enumType, value);
            }
            catch {
                StringBuilder names = new StringBuilder();
 
                foreach (string name in Enum.GetNames(_enumType)) {
                    if (names.Length != 0) {
                        names.Append(", ");
                    }
                    names.Append(name);
                }
                throw new ArgumentException(SR.GetString(SR.Invalid_enum_value, names.ToString()));
            }
            return result;
        }
    }
}