使枚举类型的选项在VS的属性窗里显示为中文

使枚举类型的选项在VS的属性窗里显示为中文

     我们自己做的组件,一般希望它的属性在设计时能够在属性窗里显示为中文,可以在属性上添加System.ComponentModel.DisplayNameAttribute标注达到这个目的。但是,枚举的选项如何以中文的形式显示在属性窗里呢?

     假设我们有如下枚举:

   1: public enum MyEnum
   2: {    
   3:     A,   
   4:     B
   5: }

     在某个组件里有一个MyEnum类型的属性,如下:

   1: [DisplayName("我的枚举")]
   2:  public MyEnum MyEnum
   3:  {
   4:      get;set;
   5:  }

     在设计时把这个组件拖到设计器中,发现属性窗中出现了“我的枚举”这个属性,但选项是A和B,如何让它们示为“选项一”和“选项二”呢?这就需要利用到TypeConverter了,因为PropertyGrid利用TypeConverter来显示枚举的选项的。另外,为了使扩展性更好,我们还需要DescriptionAttribute.

     继承System.ComponentModel.EnumConverter,实现自己的Converter,如下:

   1: public class MyEnumConverter : EnumConverter
   2: {
   3:     private IDictionary<object, string> dic;
   4:     private IDictionary<string, object> dic2;
   5:     private readonly Type type = typeof(MyEnum);
   6:  
   7:     public MyEnumConverter()
   8:         : base(typeof(MyEnum))
   9:     {
  10:     }
  11:     
  12:  
  13:     public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
  14:     {
  15:         if(value is string)
  16:         {
  17:             if(dic2 != null && dic2.ContainsKey(value as string))
  18:             {
  19:                 return dic2[value as string];
  20:             }
  21:         }
  22:         return base.ConvertFrom(context, culture, value);
  23:     }
  24:  
  25:     public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
  26:     {
  27:         if(destinationType == typeof(string))
  28:         {
  29:             if(dic == null)
  30:             {
  31:                 dic = new Dictionary<object, string>();
  32:                 dic2 = new Dictionary<string, object>();
  33:                 Type reflectionType = TypeDescriptor.GetReflectionType(this.type);
  34:                 if (reflectionType == null)
  35:                 {
  36:                     reflectionType = this.type;
  37:                 }
  38:                 FieldInfo[] fields = reflectionType.GetFields(BindingFlags.Public | BindingFlags.Static);
  39:                 ArrayList list = null;
  40:                 if ((fields != null) && (fields.Length > 0))
  41:                 {
  42:                     list = new ArrayList(fields.Length);
  43:                 }
  44:                 if (list != null)
  45:                 {
  46:                     foreach (FieldInfo info in fields)
  47:                     {
  48:                         object fieldValue = info.GetValue(info);
  49:                         string desc = fieldValue.ToString();
  50:                         DescriptionAttribute descriptionAttribute = null;
  51:                         foreach (DescriptionAttribute a in info.GetCustomAttributes(typeof(DescriptionAttribute), false))
  52:                         {
  53:                             descriptionAttribute = a;
  54:                             break;
  55:                         }
  56:                         if (descriptionAttribute != null)
  57:                         {
  58:                             desc = descriptionAttribute.Description;
  59:                         }
  60:                         dic[fieldValue] = desc;
  61:                         dic2[desc] = fieldValue;
  62:                     }
  63:                 }
  64:             }
  65:             return dic[value];
  66:         }
  67:         
  68:         return base.ConvertTo(context, culture, value, destinationType);
  69:     }
  70: }

     然后修改MyEnum,如下:

   1: public enum MyEnum
   2: {
   3:     [Description("选项一")]
   4:     A,
   5:     [Description("选项二")]
   6:     B
   7: }

     并且修改组件里的属性,加入TypeConverterAttribute,如下:

   1: [DisplayName("我的枚举")]
   2: [TypeConverter(typeof(MyEnumConverter))]
   3: public MyEnum MyEnum
   4: {
   5:     get;
   6:     set;
   7: }

     这样,就可以以中文的形式在属性窗里显示枚举的选项了,如下图:

     image

作者:明年我18
出处: http://www.cnblogs.com/default
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值