前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使枚举类型的选项在VS的属性窗里显示为中文

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

作者头像
明年我18
发布2019-09-18 11:37:44
1.1K0
发布2019-09-18 11:37:44
举报
文章被收录于专栏:明年我18明年我18

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

假设我们有如下枚举:

代码语言:javascript
复制
1: public enum MyEnum   2: {       3:     A,      4:     B   5: }

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

代码语言:javascript
复制
1: [DisplayName("我的枚举")]   2:  public MyEnum MyEnum   3:  {   4:      get;set;   5:  }

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

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

代码语言:javascript
复制
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,如下:

代码语言:javascript
复制
1: public enum MyEnum   2: {   3:     [Description("选项一")]   4:     A,   5:     [Description("选项二")]   6:     B   7: }

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

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

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

image
image
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2010-06-12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档