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

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

 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:女,男

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

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

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏灯塔大数据

技术 | Python从零开始系列连载(十九)

但它的特点就是下次使用next(a)时,接着上次的断点继续运行,直到下一个yield

11930
来自专栏chenjx85的技术专栏

leetcode-137-Single Number II-第二种解法

5.1K120
来自专栏coding for love

JS入门难点解析2-JS的变量提升和函数提升

(注1:如果有问题欢迎留言探讨,一起学习!转载请注明出处,喜欢可以点个赞哦!) (注2:更多内容请查看我的目录。)

15830
来自专栏九彩拼盘的叨叨叨

如何给函数取个合适的名字

Quora 和 Ubuntu Forums thread 上的 4500 个程序员对上面的问题进行投票。49%的程序员认为给函数,变量等命名是最难的任务。

8820
来自专栏Java帮帮-微信公众号-技术文章全总结

​图;代码轻松理解,代理

代理 代理是英文 Proxy 翻译过来的。我们在生活中见到过的代理,大概最常见的就是朋友圈中卖面膜的同学了。 她们从厂家拿货,然后在朋友圈中宣传,然后卖给熟人。...

31950
来自专栏阿凯的Excel

让你眼花缭乱的匹配函数反查技巧

小编已经连续写了三期关于匹配函数的用法,匹配函数的扛把子(老大)肯定是Vlookup函数莫属,但是Vlookup函数有一个问题,就是要查找的内容,必须在查找内容...

30960
来自专栏

shell之sort命令

1 sort的工作原理 sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。 [rocro...

21670
来自专栏编程之旅

数据结构——无权图的路径问题(C++和java实现)

好像又是接近半个月没有更新,这半个月忙着结婚的各项事情,本来预计的学习任务也拖拖拉拉,进度缓慢。吐槽一句,拍婚纱照真的是最非常非常累的一件事情,不想再有下次了。

12720
来自专栏苦逼的码农

Hash冲突之开放地址法

比如说我的输入是任意一个自然数(0,1,2,3...),而我要求经过一个函数后我的输出的数的范围要在0-9这样一个范围之间。

79720
来自专栏take time, save time

你所能用到的BMP格式介绍(二)

一、可能你忽视的基础         在正式开始之前,我不得不从最基本的地方开始,因为这些地方大多数人会忽视的一干二净,如果不在开始进行说明,那么在后面一定会有...

30470

扫码关注云+社区

领取腾讯云代金券