巧用枚举类型,实现项目的多语言切换

简介:

在项目程序中实现多语言,有多种方式,而枚举类型的多语言处理,是比较头疼的问题。比如有下面这个枚举类型:

复制代码
 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:女,男

 

最后,当我们需要部署中文或者因为的程序,只需要修改这个条件编译符合,重新编译这个包含枚举的程序集即可。

枚举方式的多语言问题,是不是很简单?

 

如果是爱思考的同学,可能会问,我修改了包含枚举类型定义的程序集的条件编译符号,为何主程序可以正常使用而不报错?

这就涉及到编译器对枚举类型的处理行为了,枚举类型在编译时,是直接替换成枚举项的值的,所以使用枚举类型的时候,是不能随意更改枚举项的顺序和值的,也不能随意减少枚举项目,否则可能出现错误。



    本文转自深蓝医生博客园博客,原文链接:http://www.cnblogs.com/bluedoctor/p/4992438.html,如需转载请自行联系原作者



相关文章
|
C#
WPF 界面实现多语言支持 中英文切换 动态加载资源字典
原文:WPF 界面实现多语言支持 中英文切换 动态加载资源字典 1、使用资源字典,首先新建两个字典文件en-us.xaml、zh-cn.xaml。定义中英文的字符串在这里面【注意:添加xmlns:s="clr-namespace:System;assembly=mscorlib】 zh-cn.
2897 0
|
21天前
|
开发工具 Web App开发 IDE
如何对 SAPGUI 里的 ABAP 代码语法检查功能进行自定义增强配套代码
如何对 SAPGUI 里的 ABAP 代码语法检查功能进行自定义增强配套代码
8 2
如何对 SAPGUI 里的 ABAP 代码语法检查功能进行自定义增强配套代码
|
2月前
|
小程序 IDE TensorFlow
【社区每周】插件开发支持“静态懒加载”模式;小程序新增“占位组件”(2022年5月第三期)
【社区每周】插件开发支持“静态懒加载”模式;小程序新增“占位组件”(2022年5月第三期)
20 0
|
3月前
|
XML JavaScript 前端开发
使用 doscify 将文章写成文档一般丝滑
使用 doscify 将文章写成文档一般丝滑
56 0
|
6月前
|
JavaScript
带你读《现代TypeScript高级教程》十四、扩展类型定义(2)
带你读《现代TypeScript高级教程》十四、扩展类型定义(2)
|
6月前
|
JavaScript 前端开发 安全
带你读《现代TypeScript高级教程》十四、扩展类型定义(1)
带你读《现代TypeScript高级教程》十四、扩展类型定义(1)
|
6月前
|
JavaScript API
带你读《现代TypeScript高级教程》十四、扩展类型定义(3)
带你读《现代TypeScript高级教程》十四、扩展类型定义(3)
|
10月前
|
Web App开发 缓存 小程序
教你如何写一个符合自己需求的小程序日历组件
教你如何写一个符合自己需求的小程序日历组件
VBA最常用的基础代码、基础功能写法总结
VBA最常用的基础代码、基础功能写法总结
110 0
Revit二次开发—内建类别BuiltInCategory枚举(中英文对照)
Revit二次开发—内建类别BuiltInCategory枚举(中英文对照)