巧用枚举类型,实现项目的多语言切换
在项目程序中实现多语言,有多种方式,而枚举类型的多语言处理,是比较头疼的问题。比如有下面这个枚举类型:
public enum MySex
{
Women = 0,
Man = 1
}
如果想在界面上输出这个枚举项,直接的做法如下处理:
Console.WriteLine("Sex:{0},{1}",MySex.Women,MySex.Man);
程序输出:
Sex:Women,Man
如果我们想输出枚举项的中文名称,怎么办呢?
通常的做法是这样:
public enum MySex
{
[Description("女")]
Women = 0,
[Description("男")]
Man = 1
}
然后反射枚举项,拿到特性申明的内容,大概使用的样子可能是这样的:
Console.WriteLine("Sex:{0},{1}",GetEnumDescription<MySex>(MySex.Women),
GetEnumDescription<MySex>(MySex.Man));
GetEnumDescription 函数是一个使用反射获取枚举项描述的功能,具体实现略。
有没有发现,现在这种使用方式,已经违背了我们使用枚举的最初形式了?多加了一个方法调用。
有没有更好的方式?
有,就是定义一个中文的枚举类型:
public enum MySex
{
女 = 0,
男 = 1
}
但是,这样在项目中同时定义了2次性别枚举类型,肯定编译不过。怎么办呢?
这是,.NET的“条件编译”神器出场了。
为了管理代码方便,我们在项目里面添加2个文件:
- Enum_Lan_En.cs
- Enum_Lan_Zh.cs
En的文件表示英语的枚举定义文件,Zh表示中文的枚举定义文件,在这2个文件中,分别这样定义枚举:
Enum_Lan_En.cs:
namespace MyEnum
{
#if(Lan_En)
public enum MySex
{
Women = 0,
Man = 1
}
#endif
}
Enum_Lan_Zh.cs:
namespace MyEnum
{
#if(Lan_Zh)
public enum MySex
{
女 = 0,
男 = 1
}
#endif
}
此时,需要在程序集上指定一个条件编译符合,具体在
项目属性-》生成-》常规-》条件编译符号: 输入
Lan_En
这样,我们在主程序里面按照下面的样子使用枚举,即可正常编译使用:
Console.WriteLine("Sex:{0},{1}",MySex.Women,MySex.Man);
当然,如果你想在主程序里面使用中文枚举,也没有关系,在
项目属性-》生成-》常规-》条件编译符号: 输入
Lan_Zh
即可。
Console.WriteLine("Sex:{0},{1}",MySex.女,MySex.男);
程序输出:
Sex:女,男
最后,当我们需要部署中文或者因为的程序,只需要修改这个条件编译符合,重新编译这个包含枚举的程序集即可。
枚举方式的多语言问题,是不是很简单?
如果是爱思考的同学,可能会问,我修改了包含枚举类型定义的程序集的条件编译符号,为何主程序可以正常使用而不报错?
这就涉及到编译器对枚举类型的处理行为了,枚举类型在编译时,是直接替换成枚举项的值的,所以使用枚举类型的时候,是不能随意更改枚举项的顺序和值的,也不能随意减少枚举项目,否则可能出现错误。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 浅谈thinkphp的nginx配置,以及重写隐藏index.php入口文件方法
- php图片裁剪函数
- Laravel自定义 封装便捷返回Json数据格式的引用方法
- Laravel模糊查询区分大小写的实例
- laravel实现一个上传图片的接口,并建立软链接,访问图片的方法
- Laravel中validation验证 返回中文提示 全局设置的方法
- laravel5表单唯一验证的实例代码
- 实现laravel 插入操作日志到数据库的方法
- laravel validate 设置为中文的例子(验证提示为中文)
- Laravel 使用查询构造器配合原生sql语句查询的例子
- php面试实现反射注入的详细方法
- laravel框架 api自定义全局异常处理方法
- laravel实现于语言包的完美切换方法
- PHP校验15位和18位身份证号的类封装
- 用Echarts打造一个轮播图!