博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于enum类型的本地化的一种方法探索:
阅读量:5308 次
发布时间:2019-06-14

本文共 2515 字,大约阅读时间需要 8 分钟。

enum类型是一种符号标记,便于开发者在程序编码中使用,从而避免数字类的状态标记。正是因为其主要是用于代码层面,所以设计之初就没有考虑过本地化的支持。但是,在很多情况下,我们都需要绑定enum类型到一个类似于ComboBox的控件以提供用户选择项,这个时候,本地化就显得必要了。当然,enum的本地化方式多种多样,本文试图探讨一种利用DataAnnotation的方法间接实现本地化。

首先,定义一个DeviceType类型,并使用DataAnnotation方式标记enum类型的本地化资源(具体请参考DataAnnotation),示例中提供了英文和中文的两个资源文件,默认英文。

public enum DeviceType    {        [Display(Name="laptop",ResourceType=typeof(ApplicationResource))]        LapTop,        [Display(Name = "desktop", ResourceType = typeof(ApplicationResource))]        Desktop,        [Display(Name = "mobile", ResourceType = typeof(ApplicationResource))]        MobilePhone,        [Display(Name = "router", ResourceType = typeof(ApplicationResource))]        Router,        [Display(Name = "fax", ResourceType = typeof(ApplicationResource))]        Fax    }

 

 然后,编写一个扩展方法,用于将enum类型转换为Dictionary<int,string>类型的字典,其中int为enum项的常量值,string为该enum项的本地化字符串,具体如下:

public static class EnumExtension    {        public static Dictionary
ToDictionary(this Type enumType) { if (!enumType.IsEnum) { throw new ArgumentException("Type must be enum!"); } Dictionary
enumStrings = new Dictionary
(); //查看枚举类型中的每项,如果有DisplayAttribute,则使用其本地化的字符串资源,否则,直接使用枚举的默认名称 int[] enumValues = Enum.GetValues(enumType) as int[]; foreach (int v in enumValues) { string enumName = Enum.GetName(enumType, v); DisplayAttribute[] attributes = enumType.GetField(enumName).GetCustomAttributes(typeof(DisplayAttribute), false) as DisplayAttribute[]; if (attributes == null || attributes.Length < 1) { enumStrings.Add(v, enumName); } else { ResourceManager mgr = new ResourceManager(attributes[0].ResourceType); enumStrings.Add(v,mgr.GetString(attributes[0].Name)); } } return enumStrings; } }

然后,在任何需要枚举类型的控件上直接绑定ToDictionary方法返回的字典即可。如下例中在Silverlight中:

 

public MainPage()        {            InitializeComponent();            comboBox.ItemsSource = typeof(DeviceType).ToDictionary();            comboBox.SelectedIndex = 0;            comboBox.DisplayMemberPath = "Value";            comboBox.SelectedValuePath = "Key";        }

这样,在设置了线程的语言文化Thread.CurrentCulture后即可实现枚举类型的本地化。

 

 

转载于:https://www.cnblogs.com/kennywangjin/archive/2013/05/08/3067105.html

你可能感兴趣的文章
利用maven管理项目之POM文件配置
查看>>
TCL:表格(xls)中写入数据
查看>>
Oracle事务
查看>>
String类中的equals方法总结(转载)
查看>>
属性动画
查看>>
标识符
查看>>
给大家分享一张CSS选择器优选级图谱 !
查看>>
Win7中不能调试windows service
查看>>
通过httplib2 探索的学习的最佳方式
查看>>
快来熟练使用 Mac 编程
查看>>
Node.js 入门:Express + Mongoose 基础使用
查看>>
一步步教你轻松学奇异值分解SVD降维算法
查看>>
使用pager进行分页
查看>>
UVA - 1592 Database
查看>>
Fine Uploader文件上传组件
查看>>
javascript中的传递参数
查看>>
objective-c overview(二)
查看>>
python查询mangodb
查看>>
consonant combination
查看>>
驱动的本质
查看>>