zoukankan      html  css  js  c++  java
  • 让枚举成员显示出中文信息(转)

    转自:http://www.cnblogs.com/sukyboor/archive/2006/04/22/382173.html
    定义枚举成员的时候经常很犯愁.那就是怎么显示的问题.你说成员名称用中文吧
    好象显的不够专业,毕竟中文在程序开发了是弱势语言.
    public enum SexEnum 

          男 
    = 0,
           女 
    如果向上面这样写的话,极容易被bs,所以在很多时候看到同事们是这么写的
    public enum SexEnum 

          men 
    = 0,
           women
    这样写也不行啊,如果显示出来的时候,会显示          性别: women 如果把这样的软件给客户用.准能把客户气吐血.
    于是又在这个基础上加个转换函数 GetSexEnumCnName
    //获取性别类型的中文名称
    private string GetSexEnumCnName(SexEnum sex){
        
    switch(sex){
           
    case SexEnum.men:
              
    return "";
            
    case SexEnum.women:
              
    return ""
        }

        
    return "";
    }
    那还有没有别的解决方法?
    昨天晚上为了给aps加上显示功能,我想到了个比较偷巧的解决方法
    一、给枚举类型的各个枚举值加上自定义属性
    二、要显示的时候就获得枚举自定义属性
    实现方法如下:
        using System;
        
    using System.Collections;
        
    using System.ComponentModel;
        
    using SPL.Persister.Attributes;
        
        
        
    /// <summary>性别</summary>
        public enum SexEnum {
            [Description(
    "")]
            men,
           
            [Description(
    "")]
            women,
        }
    Description是System.ComponentModel上自定义的属性.用于指定属性或事件的说明
    好了,接下来是显示的工作了.
            /// <summary>
            
    /// 获取枚举值的详细文本
            
    /// </summary>
            
    /// <param name="e"></param>
            
    /// <returns></returns>

            public static string GetEnumDescription(object e)
            
    {
                
    //获取字段信息
                System.Reflection.FieldInfo[] ms = e.GetType().GetFields();    
        
                Type t 
    = e.GetType();
                
    foreach(System.Reflection.FieldInfo f in  ms)    
                
    {
                    
    //判断名称是否相等
                    if(f.Name != e.ToString())continue;

                    
    //反射出自定义属性
                    foreach(Attribute attr in  f.GetCustomAttributes(true))
                    
    {
                        
    //类型转换找到一个Description,用Description作为成员名称
                        System.ComponentModel.DescriptionAttribute dscript = attr as System.ComponentModel.DescriptionAttribute;                            
                        
    if(dscript != null)                    
                            
    return     dscript.Description;
                    }


                }

                
                
    //如果没有检测到合适的注释,则用默认名称
                return e.ToString();
            }
    使用方法
             //显示性别
             lbSex.Text = GetEnumDescription(SexEnum.man);



        
    //用下拉列表框显示性别类型                
        DropDownList ddl =new DropDownList();
        
    foreach(object e in Enum.GetValues(typeof(SexEnum)))                        
            ddl.Items.Add(
    new ListItem( GetEnumDescription(e),((int)e).ToString()));
    看到这里也许有人该问了?性能问题如何解决?我这里提一个方法把"SexEnum.man"作为key,把dscript 缓存起来.................这个简单吧,具体实现我就不写了

    百足之虫,死而不僵

    作者:KKcat
        
    个人博客:http://jinzhao.me/
        
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    Discuz热搜在哪里设置?
    Discuz如何设置帖子隐藏回复可见或部分可见方法
    新版Discuz!应用中心接入教程(转)
    Diszuz管理面版被锁怎么办?
    vs 2019 调试无法查看变量
    Google Docs 的格式刷快捷键
    chrome 的常用快捷键
    Activiti 数据库表结构
    activiti 报 next dbid
    尚硅谷Java基础_Day2
  • 原文地址:https://www.cnblogs.com/jinzhao/p/1551261.html
Copyright © 2011-2022 走看看