获取动态枚举的值和说明

#region 获得枚举类型所包含的全部项的列表

        /// <summary>
        /// 获得枚举类型所包含的全部项的列表。
        /// </summary>
        /// <param name="enumType">枚举的类型</param>
        /// <param name="withAll">是否包含"All"</param>
        /// <returns></returns>
        public List<EnumItem> GetEnumItems(Type enumType, bool withAll)
        {
            List<EnumItem> list = new List<EnumItem>();

            if (enumType.IsEnum != true)
            {
                // 不是枚举类型
                throw new InvalidOperationException();
            }

            // 包含 All 选项
            //if (withAll == true)
            //    list.Add(new EnumItem(AppConst.IntNull, "All"));

            // 获得特性Description的类型信息
            Type typeDescription = typeof(DescriptionAttribute);

            // 获得枚举的字段信息(因为枚举的值实际上是一个static的字段的值)
System.Reflection.FieldInfo[] fields = enumType.GetFields();

            // 检索所有字段
            foreach (FieldInfo field in fields)
            {
                // 过滤掉一个不是枚举值的,记录的是枚举的源类型
                if (field.FieldType.IsEnum == false)
                    continue;

                // 通过字段的名字得到枚举的值
                int value = (int)enumType.InvokeMember(field.Name, BindingFlags.GetField, null, null, null);
                string text = string.Empty;

                // 获得这个字段的所有自定义特性,这里只查找Description特性
                object[] arr = field.GetCustomAttributes(typeDescription, true);
                if (arr.Length > 0)
                {
                    // 因为Description自定义特性不允许重复,所以只取第一个
                    DescriptionAttribute aa = (DescriptionAttribute)arr[0];

                    // 获得特性的描述值
                    text = aa.Description;
                }
                else
                {
                    // 如果没有特性描述,那么就显示英文的字段名
                    text = field.Name;
                }
                list.Add(new EnumItem(value, text));
            }

            return list;
        }

        #endregion

   public class EnumItem
    {
        private object m_key;
        private object m_value;

        public object Key
        {
            get { return m_key; }
            set { m_key = value; }
        }

        public object Value
        {
            get { return m_value; }
            set { m_value = value; }
        }

        public EnumItem(object _key, object _value)
        {
            m_key = _key;
            m_value = _value;
        }
    }

public enum EnumReturnedType
    {

     [DisplayName("说明")]
    Returned = 1,

}

第二种方法:

public enum EnumReturnedType
    {
        /// <summary>
        /// 退货
        /// </summary>
        [EnumAttribute("退货")]
        Returned = 1,

    }

-------------------------------------------------------

    /// <summary>
    /// 自定义属性
    /// </summary>   
    [AttributeUsage(AttributeTargets.Field, AllowMultiple = true)]
    public class EnumAttribute : Attribute
    {
        /// <summary>
        /// 适用区域性
        /// </summary>
        public string Culture { set; get; }

        /// <summary>
        /// 说明信息
        /// </summary>
        public string Description { set; get; }

        /// <summary>
        /// 初始化说明信息
        /// </summary>
        /// <param name="description">说明信息</param>
        public EnumAttribute(string description)
        {
            this.Description = description;
            this.Culture = string.Empty;
        }

        /// <summary>
        /// 初始化说明信息及适用区域性
        /// </summary>
        /// <param name="description">说明信息</param>
        /// <param name="culture">适用区域性</param>
        public EnumAttribute(string description, string culture)
        {
            this.Description = description;
            this.Culture = culture;
        }
    }

   /// <summary>
        /// 获得枚举说明
        /// </summary>
        public static Dictionary<Enum, string> GetDescriptions(Type t)
        {

            Dictionary<Enum, string> d = new Dictionary<Enum, string>();

            if (t.IsEnum == false) return d;

            var values = Enum.GetValues(t);

            foreach (var item in values) d.Add((Enum)item, ((Enum)item).GetDescription());

            return d;
        }

用法:

Dictionary<Enum, string> disType = EnumHelper.GetDescriptions(typeof(EnumReturnedType));

            foreach (var kv in disType)
            {
                type.Add(new SelectListItem
                {
                    Value = kv.Key.ToString("d"),
                    Text = kv.Value
                });
            }

<think>我们正在处理用户的问题:如何在Java中获取枚举类型的int。 根据提供的引用,我们可以总结几种方法: 引用[1]:提到了一个流程图类图,但具体内容不详细。不过它提到了EnumExample类有getValue()方法,这暗示我们可以在枚举中定义一个方法返回int。 引用[2]:提供了一个简单的示例:通过类型转换(int)Sample.Book来获取int。但这要求枚举常量在定义时被赋予了整数,并且枚举的底层存储是int(实际上Java枚举默认继承自Enum类,不能直接转换为int,除非我们给每个枚举常量指定一个int)。 引用[3]:虽然是一篇概括性的文章,提到了多种获取枚举的方法,包括按名取(valueOf())获取所有枚举(values()),以及反射等方法。但具体到int,可能还是在枚举中定义字段方法来返回int。 引用[4]:展示了通过int获取枚举对象的两种方法,其中第一种是调用一个自定义方法intToEnum(可能是自定义的静态方法),第二种是调用枚举类的codeOf方法(这也是自定义的)。这间接说明我们可以为枚举类编写通过int查找枚举常量的方法,同时每个枚举常量都有一个关联的int。 因此,我们可以得出: 1. 在定义枚举时,为每个枚举常量关联一个int(通过构造函数)。 2. 在枚举类中定义一个方法(如getValue())来返回这个int。 3. 这样,我们就可以通过枚举常量调用getValue()来获取int。 此外,引用[2]还提到了一种直接转换的方式:(int)Sample.Book,但这在Java中是不允许的,除非枚举常量有一个对应的整数并且我们通过某种方式(比如上面的getValue())来获取,然后进行转换。实际上,在Java中我们不能直接将枚举常量转换为int(除非使用ordinal()方法,但ordinal()返回的是枚举常量的序数,即声明顺序,从0开始)。如果我们希望自定义int(比如从1开始),那么我们就需要自己定义字段方法。 所以,正确的方法应该是: 步骤1:定义一个枚举,并在其中声明一个私有字段(比如int code)对应的构造方法。 步骤2:为每个枚举常量指定一个int(在构造时传入)。 步骤3:提供public方法(如getValue())来返回这个int。 另外,我们也可以提供通过int获取枚举常量的静态方法(如引用[4]中的codeOf方法),但这不是用户当前问题的要求(用户要求获取枚举的int)。 示例代码如下: ```java public enum Sample { Book(1), Pen(2), Pencil(3); private final int value; private Sample(int value) { this.value = value; } public int getValue() { return value; } } ``` 然后,我们可以这样使用: ```java Sample book = Sample.Book; int bookValue = book.getValue(); // 得到1 ``` 另外,如果我们希望使用ordinal()方法,那么我们可以直接使用Sample.Book.ordinal(),但这样得到的是0(因为Book是第一个),而不是1。所以如果我们需要自定义的int,就不能依赖ordinal()。 因此,总结:通过定义字段getValue()方法来获取枚举的int。 注意:引用[2]中的直接转换(int)Sample.Book在Java中是错误的,因为枚举类型不能直接转换为int(除非是枚举的ordinal,但也不是这样转换,而是调用方法)。所以用户不要尝试直接转换。 根据上述分析,我们给出回答。 </think>在Java中获取枚举的int,需要通过定义自定义字段方法实现。以下是详细步骤及示例: ### 步骤说明 1. **定义枚举并添加int字段** 在枚举构造方法中声明int类型字段,为每个枚举常量指定对应的整数。 2. **实现取方法** 添加`getValue()`方法返回枚举关联的int。 3. **使用枚举** 通过枚举常量直接调用`getValue()`获取int。 ### 完整代码示例 ```java public enum Sample { // 定义枚举常量并关联int BOOK(1), PEN(2), PENCIL(3); private final int value; // 存储int的字段 // 枚举构造方法 Sample(int value) { this.value = value; } // 获取int的方法 public int getValue() { return value; } // 可选:通过int反向获取枚举(根据引用[4]) public static Sample fromValue(int value) { for (Sample item : values()) { if (item.value == value) { return item; } } throw new IllegalArgumentException("无效的: " + value); } } ``` ### 使用示例 ```java public class Main { public static void main(String[] args) { // 获取枚举的int(核心需求) int bookValue = Sample.BOOK.getValue(); // 返回 1 int penValue = Sample.PEN.getValue(); // 返回 2 // 通过int获取枚举(额外功能) Sample item = Sample.fromValue(3); // 返回 PENCIL } } ``` ### 关键说明 1. **不可直接强转** Java枚举不能像C#那样直接强制转换为int(如`(int)Sample.BOOK`),必须通过自定义字段实现[^2]。 2. **与`ordinal()`的区别** - 避免使用内置的`ordinal()`方法(返回声明顺序,从0开始) - 自定义`value`字段可灵活指定任意整数[^3]。 3. **关联其他类型** 相同逻辑可扩展为关联String等类型(如`getCode()`方法)[^4]。 > 此方法符合Java枚举的最佳实践,能清晰表达业务语义,避免魔法数字[^3]。 --- ### 相关问题 1. 如何在枚举中关联String而非int? 2. 枚举的`ordinal()``name()`方法有什么局限性? 3. 如何为枚举实现JSON序列化/反序列化? 4. 枚举与常量类(Constant Class)如何选择? [^1]: 枚举设计需明确定义取方法 [^2]: Java不支持枚举直接强转为int [^3]: 自定义字段优于`ordinal()`的声明顺序依赖 [^4]: 相同模式可扩展关联多种数据类型
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值