zoukankan      html  css  js  c++  java
  • 巧用枚举类型,实现项目的多语言切换

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

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

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

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

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

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

  • 相关阅读:
    java设计模式概述
    Filter
    hello1 hello2 代码分析
    计划
    页面生命周期1
    Jquery
    关于DropDownList
    页面生命周期
    随机生成验证码
    关于技术
  • 原文地址:https://www.cnblogs.com/bluedoctor/p/4992438.html
Copyright © 2011-2022 走看看