获取枚举类型的 中文 描述 和值,根据值获取名称

C# 通过Attitude特性来实现,相对方便些

namespace Extensions
{
    /// <summary>
    /// 定义枚举扩展类
    /// </summary>
    public static class EnumExtensions
    {
        /// <summary>
        /// 获取枚举变量值的 Description 属性
        /// </summary>
        /// <param name="obj">枚举变量</param>
        /// <returns>如果包含 Description 属性,则返回 Description 属性的值,否则返回枚举变量值的名称</returns>
        public static string GetDescription(this object obj)
        {
            return GetDescription(obj, false);
        }
        /// <summary>
        /// 获取枚举变量值的 Description 属性
        /// </summary>
        /// <param name="obj">枚举变量</param>
        /// <param name="isTop">是否改变为返回该类、枚举类型的头 Description 属性,而不是当前的属性或枚举变量值的 Description 属性</param>
        /// <returns>如果包含 Description 属性,则返回 Description 属性的值,否则返回枚举变量值的名称</returns>
        public static string GetDescription(this object obj, bool isTop)
        {
            if (obj == null)
            {
                return string.Empty;
            }
            try
            {
                var enumType = obj.GetType();
                DescriptionAttribute dna;
                if (isTop)
                {
                    dna = (DescriptionAttribute)Attribute.GetCustomAttribute(enumType, typeof(DescriptionAttribute));
                }
                else
                {
                    var fi = enumType.GetField(Enum.GetName(enumType, obj));
                    dna = (DescriptionAttribute)Attribute.GetCustomAttribute(fi, typeof(DescriptionAttribute));
                }
                if (dna != null && string.IsNullOrEmpty(dna.Description) == false)
                {
                    return dna.Description;
                }
            }
            catch
            {
            }
            return obj.ToString();
        }
        /// <summary>
        /// 获取枚举变量值的 ExtendProperty 属性
        /// </summary>
        /// <param name="obj">枚举变量</param>
        /// <returns>如果包含 ExtendProperty 属性,则返回 ExtendProperty 属性的值,否则返回枚举变量值的名称</returns>
        public static string GetExtendProperty(this object obj)
        {
            if (obj == null)
            {
                return string.Empty;
            }
            try
            {
                Type _enumType = obj.GetType();
                ExtendPropertyAttribute dna = null;

                FieldInfo fi = _enumType.GetField(Enum.GetName(_enumType, obj));
                dna = (ExtendPropertyAttribute)Attribute.GetCustomAttribute(
                   fi, typeof(ExtendPropertyAttribute));

                if (dna != null && !string.IsNullOrEmpty(dna.ExtendProperty))
                    return dna.ExtendProperty;
            }
            catch
            {
            }
            return obj.ToString();
        }
    }


    [AttributeUsage(AttributeTargets.Field)]
    public class ExtendPropertyAttribute : Attribute
    {
        public string ExtendProperty;
        public ExtendPropertyAttribute(string extendProperty)
        {
            this.ExtendProperty = extendProperty;
        }
    }
}


static class Program
{
    public enum EnumTest
    {
        [Description("")]
        Undefinition,
        [Description("红色")]
        Red,
        [Description("绿色")]
        Green,
        [Description("蓝色")]
        Blue = 4
    }

    private static void Main(string[] args)
    {
        foreach (EnumTest enumTest in Enum.GetValues(typeof(EnumTest)))
        { 
            Console.WriteLine((int)enumTest + ":" + enumTest);
        }

        Console.WriteLine("名称:" + EnumTest.Blue.GetDescription());
        Console.WriteLine("值:" + (int)EnumTest.Blue);
        Console.ReadLine();
    }
}

JAVA 编码的时候繁琐些,每次都需要定义 get,set 方法,下面是目前找到的相对好使,常用的方法

public enum EnumTest {
    Undefinition(0,""),Red(1, "红色"), Green(2, "绿色"), Blue(4, "蓝色");

    private int _value;
    private String _name;

    EnumTest(int value, String name)
    {
        _value = value;
        _name = name;
    }

    public int getValue()
    {
        return _value;
    }

    public String getName()
    {
        return _name;
    }
}

 

//根据值,获取名称
public String getName(int value) {  
    for (EnumTest enumType : EnumTest.values()) {  
        if (enumType.getValue().equals(value)) {  
            return enumType.getName();  
        }  
    }  
    return null;  // 或者你可以抛出一个异常,表示没有找到匹配的值  
}

public static void main(String[] args) throws Exception {
    EnumSet<EnumTest> weekSet = EnumSet.allOf(EnumTest.class);
    for (EnumTest day : weekSet) {
        System.out.println(day.getName());
        System.out.println(day.getValue());
    }
    System.out.println("名称:"+EnumTest.Blue.getName());
    System.out.println("顺序值:"+EnumTest.Blue.ordinal());
    System.out.println("自定义值:"+EnumTest.Blue.getValue());
}

 

 EnumHelper

public class EnumHelper
{
    public static string GetDescription(System.Enum value)
    {
        Type type = value.GetType();
        FieldInfo item = type.GetField(value.ToString(), BindingFlags.Public | BindingFlags.Static);
        if (item == null) return null;
        var attribute = Attribute.GetCustomAttribute(item, typeof(DescriptionAttribute)) as DescriptionAttribute;
        if (attribute != null && !string.IsNullOrEmpty(attribute.Description)) return attribute.Description;
        return null;
    }

    /// <summary>
    /// 返回枚举值的描述信息。
    /// </summary>
    /// <param name="value">要获取描述信息的枚举值。</param>
    /// <returns>枚举值的描述信息。</returns>
    public static string GetDescription<T>(int value)
    {
        Type enumType = typeof(T);
        DescriptionAttribute attr = null;
        // 获取枚举常数名称。
        string name = System.Enum.GetName(enumType, value);
        if (name != null)
        {
            // 获取枚举字段。
            FieldInfo fieldInfo = enumType.GetField(name);
            if (fieldInfo != null)
            {
                // 获取描述的属性。
                attr = Attribute.GetCustomAttribute(fieldInfo, typeof(DescriptionAttribute), false) as DescriptionAttribute;
            }
        }
        // 返回结果
        if (attr != null && !string.IsNullOrEmpty(attr.Description))
            return attr.Description;
        else
            return string.Empty;
    }

    public static Dictionary<int,string> GetEnumList<T>()
    {
        Dictionary<int, string> selectList = new Dictionary<int, string>();
        foreach (int e in System.Enum.GetValues(typeof(T)))
        {
            selectList.Add(e, GetDescription<T>(e));
        }
        return selectList;
    }
}
EnumHelper.GetDescription<EnumTest>(2) //绿色

 

posted @ 2017-09-05 10:44  VipSoft  阅读(819)  评论(0编辑  收藏  举报