使枚举类型的选项在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: }这样,就可以以中文的形式在属性窗里显示枚举的选项了,如下图:
作者:明年我18
出处:http://www.cnblogs.com/default
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
出处:http://www.cnblogs.com/default
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。

浙公网安备 33010602011771号