The Labs \ Source Viewer \ SSCLI \ System.Configuration \ GenericEnumConverter

  1. //------------------------------------------------------------------------------
  2. // <copyright file="GenericEnumConverter.cs" company="Microsoft">
  3. //
  4. // Copyright (c) 2006 Microsoft Corporation. All rights reserved.
  5. //
  6. // The use and distribution terms for this software are contained in the file
  7. // named license.txt, which can be found in the root of this distribution.
  8. // By using this software in any fashion, you are agreeing to be bound by the
  9. // terms of this license.
  10. //
  11. // You must not remove this notice, or any other, from this software.
  12. //
  13. // </copyright>
  14. //------------------------------------------------------------------------------
  15. using System;
  16. using System.Collections;
  17. using System.IO;
  18. using System.Reflection;
  19. using System.Security.Permissions;
  20. using System.Xml;
  21. using System.Collections.Specialized;
  22. using System.Globalization;
  23. using System.ComponentModel;
  24. using System.Security;
  25. using System.Text;
  26. namespace System.Configuration
  27. {
  28.    
  29.     public sealed class GenericEnumConverter : ConfigurationConverterBase
  30.     {
  31.         private Type _enumType;
  32.        
  33.         public GenericEnumConverter(Type typeEnum)
  34.         {
  35.             if (typeEnum == null) {
  36.                 throw new ArgumentNullException("typeEnum");
  37.             }
  38.            
  39.             _enumType = typeEnum;
  40.         }
  41.        
  42.         public override object ConvertTo(ITypeDescriptorContext ctx, CultureInfo ci, object value, Type type)
  43.         {
  44.             Debug.Assert(typeof(System.Enum).IsAssignableFrom(value.GetType()), "typeof(System.Enum).IsAssignableFrom(value.GetType())");
  45.            
  46.             return value.ToString();
  47.         }
  48.        
  49.         public override object ConvertFrom(ITypeDescriptorContext ctx, CultureInfo ci, object data)
  50.         {
  51.             object result = null;
  52.             //
  53.             // For any error, throw the ArgumentException with SR.Invalid_enum_value
  54.             //
  55.             try {
  56.                 string value = (string)data;
  57.                 if (String.IsNullOrEmpty(value)) {
  58.                     throw new Exception();
  59.                 }
  60.                
  61.                 // Disallow numeric values for enums.
  62.                 if (!String.IsNullOrEmpty(value) && (Char.IsDigit(value[0]) || (value[0] == '-') || (value[0] == '+'))) {
  63.                     throw new Exception();
  64.                 }
  65.                
  66.                 if (value != value.Trim()) {
  67.                     // throw if the value has whitespace
  68.                     throw new Exception();
  69.                 }
  70.                
  71.                 result = Enum.Parse(_enumType, value);
  72.             }
  73.             catch {
  74.                 StringBuilder names = new StringBuilder();
  75.                
  76.                 foreach (string name in Enum.GetNames(_enumType)) {
  77.                     if (names.Length != 0) {
  78.                         names.Append(", ");
  79.                     }
  80.                     names.Append(name);
  81.                 }
  82.                 throw new ArgumentException(SR.GetString(SR.Invalid_enum_value, names.ToString()));
  83.             }
  84.             return result;
  85.         }
  86.     }
  87. }

Developer Fusion