1using System;
  2using System.Collections;
  3using System.Text;
  4using System.ComponentModel;
  5using System.Reflection;
  6
  7namespace Clubank.Common
  8{
  9    /// <summary>
 10    /// 提供了获得枚举的Description特性的实用方法以及可用于设计器的TypeConverter类
 11    /// </summary>

 12    public class EnumConverter : System.ComponentModel.EnumConverter
 13    {
 14        protected System.Type myVal;
 15
 16        /// <summary>
 17        /// 获得枚举值的Description特性的值,一般是消息的搜索码
 18        /// </summary>
 19        /// <param name="value">要查找特性的枚举值</param>
 20        /// <returns>返回查找到的Description特性的值,如果没有,就返回.ToString()</returns>

 21        public static string GetEnumDescription(Enum value)
 22        {
 23            FieldInfo fi = value.GetType().GetField(value.ToString());
 24            DescriptionAttribute[] attributes =
 25              (DescriptionAttribute[])fi.GetCustomAttributes(
 26              typeof(DescriptionAttribute), false);
 27            return (attributes.Length > 0? attributes[0].Description : value.ToString();
 28        }

 29
 30        /// <summary>
 31        /// 根据特定的枚举值名称获得枚举值的Description特性的值
 32        /// </summary>
 33        /// <param name="value">枚举类型</param>
 34        /// <param name="name">枚举值的名称</param>
 35        /// <returns>返回查找到的Description特性的值,如果没有,就返回.ToString()</returns>

 36        public static string GetEnumDescription(System.Type value, string name)
 37        {
 38            FieldInfo fi = value.GetField(name);
 39            DescriptionAttribute[] attributes =
 40              (DescriptionAttribute[])fi.GetCustomAttributes(
 41              typeof(DescriptionAttribute), false);
 42            return (attributes.Length > 0? attributes[0].Description : name;
 43        }

 44
 45        /// <summary>
 46        /// 基于Description特性或者枚举值名称获得具体的枚举值
 47        /// </summary>
 48        /// <param name="value">枚举类型</param>
 49        /// <param name="description">Description特性值或者元素的名称</param>
 50        /// <returns>返回枚举值。如果没找到,返回传入的Description值</returns>

 51        public static object GetEnumValue(System.Type value, string description)
 52        {
 53            FieldInfo[] fis = value.GetFields();
 54            foreach (FieldInfo fi in fis)
 55            {
 56                DescriptionAttribute[] attributes =
 57                  (DescriptionAttribute[])fi.GetCustomAttributes(
 58                  typeof(DescriptionAttribute), false);
 59                if (attributes.Length > 0)
 60                {
 61                    if (attributes[0].Description == description)
 62                    {
 63                        return fi.GetValue(fi.Name);
 64                    }

 65                }

 66                if (fi.Name == description)
 67                {
 68                    return fi.GetValue(fi.Name);
 69                }

 70            }

 71            return description;
 72        }

 73
 74        public EnumConverter(System.Type type)
 75            : base(type.GetType())
 76        {
 77            myVal = type;
 78        }

 79
 80        public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
 81        {
 82            if (value is Enum && destinationType == typeof(string))
 83            {
 84                return GetEnumDescription((Enum)value);
 85            }

 86            if (value is string && destinationType == typeof(string))
 87            {
 88                return GetEnumDescription(myVal, (string)value);
 89            }

 90            return base.ConvertTo(context, culture, value, destinationType);
 91        }

 92
 93        public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
 94        {
 95            if (value is string)
 96            {
 97                return GetEnumValue(myVal, (string)value);
 98            }

 99            if (value is Enum)
100            {
101                return GetEnumDescription((Enum)value);
102            }

103            return base.ConvertFrom(context, culture, value);
104        }

105
106        public override bool GetPropertiesSupported(ITypeDescriptorContext context)
107        {
108            return true;
109        }

110
111        public override TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
112        {
113            ArrayList values = new ArrayList();
114            FieldInfo[] fis = myVal.GetFields();
115            foreach (FieldInfo fi in fis)
116            {
117                DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(
118                   typeof(DescriptionAttribute), false);
119                if (attributes.Length > 0)
120                    values.Add(fi.GetValue(fi.Name));
121            }

122            return new TypeConverter.StandardValuesCollection(values);
123        }

124
125    }

126}

127