zoukankan      html  css  js  c++  java
  • C# 遍历enum类型元素、获取最大值、最小值

    声明:本文原创,首发于博客园 http://www.cnblogs.com/EasyInvoice/p/6070563.html 转载请注明出处。

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

    问题一:一个星期有7天,如果想要显示英文可以直接使用 Enum.ToString() 方法获取元素名称,但如果想显示中文该如何做?

    问题二:如何遍历枚举类型?

    问题三:如何获取枚举类型最大值、最小值?

    对于问题一,可以为字段增加特性,如 Desc,声明类型时指定该特性的值,如下:

        public enum MyEnum
        { 
            [Desc("星期日")]
            Sunday=100,
            [Desc("星期一")]
            Monday,
            Tuesday,
            Wednesday,
            Thursday,
            Friday,
            Saturday
        }
    
        [Serializable]
        [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = false)]
        public class Desc : Attribute
        {
            /// <summary>
            /// 获得字段或属性的中文解释.
            /// </summary>
            /// <value>字段或属性的中文解释.</value>
            public string Value { get; private set; }
            /// <summary>
            /// 初始化创建一个 <see cref="Desc"/> 类的实例, 用于指示字段或属性的解释说明.
            /// </summary>
            /// <param name="value">字段或属性的解释说明.</param>
            public Desc(string value)
            {
                Value = value;
            }
        }

     对于问题二、三,这里介绍两种方法:

    1、使用扩展方法

        public static class Util
        {
            /// <summary>
            /// 获得枚举字段的特性(Attribute),该属性不允许多次定义。
            /// </summary>
            /// <typeparam name="T">特性类型。</typeparam>
            /// <param name="value">一个枚举的实例对象。</param>
            /// <returns>枚举字段的扩展属性。如果不存在则返回 <c>null</c> 。</returns>
            public static T GetAttribute<T>(this Enum value) where T : Attribute
            {
                FieldInfo field = value.GetType().GetField(value.ToString());
                return Attribute.GetCustomAttribute(field, typeof(T)) as T;
            }
    
            /// <summary>
            /// get arrays of enum type
            /// </summary>
            /// <param name="enumType"></param>
            /// <returns></returns>
            public static Array Array(this Type enumType)
            {
                return Enum.GetValues(enumType);
            }
    
            /// <summary>
            /// name of specified enum
            /// </summary>
            /// <param name="enumType"></param>
            /// <param name="value"></param>
            /// <returns></returns>
            public static string Name(this Type enumType, object value)
            {
                Desc desc = ((Enum)value).GetAttribute<Desc>();
                if (desc != null)
                    return desc.Value;
                else
                    return Enum.GetName(enumType, value);
            }
          
            /// <summary>
            /// maximun of enum type
            /// </summary>
            /// <param name="enumType"></param>
            /// <returns></returns>
            public static int Max(this Type enumType)
            {
                Array EnumArray = Enum.GetValues(enumType);
                int max = (int)EnumArray.GetValue(0);
                foreach (int item in EnumArray)
                {
                    if (item > max)
                        max = item;
                }
                return max;
            }
    
            /// <summary>
            /// minimum of enum type
            /// </summary>
            /// <param name="enumType"></param>
            /// <returns></returns>
            public static int Min(this Type enumType)
            {
                Array EnumArray = Enum.GetValues(enumType);
                int min = (int)EnumArray.GetValue(0);
                foreach (int item in EnumArray)
                {
                    if (item < min)
                        min = item;
                }
                return min;
            }
        }
       

    调用代码:

                listBox1.Items.Clear();
                int index = 0;
    
                Type exEnum = (typeof(MyEnum));
                foreach (MyEnum item in exEnum.Array())
                {
                    listBox1.Items.Add(string.Format("元素 [{0}]: {1}", index++, exEnum.Name(item)));
                }
                listBox1.Items.Add(string.Format("最大值: [{0}] ", exEnum.Max()));
                listBox1.Items.Add(string.Format("最小值: [{0}]", exEnum.Min()));

     2、使用类方法 

        public class ExEnum
        {
            public ExEnum(Type _enumType)
            {
                EnumType = _enumType;
            }
    
            public Type EnumType { get; set; }
    
            public string Name(object value)
            {
                Desc desc = ((MyEnum)value).GetAttribute<Desc>();
                if (desc != null)
                    return desc.Value;
                else 
                    return Enum.GetName(EnumType, value);
            }
            public int Max
            {
                get
                {
                    int max = (int)Array.GetValue(0);
                    foreach (int item in Array)
                    {
                        if (item > max)
                            max = item;
                    }
                    return max;
                }
            }
    
            public int Min
            {
                get
                {
                    int min = (int)Array.GetValue(0);
                    foreach (int item in Array)
                    {
                        if (item < min)
                            min = item;
                    }
                    return min;
                }
            }
    
            public Array Array
            {
                get { return Enum.GetValues(EnumType); }
            }
        }

     调用方法:

                listBox1.Items.Clear();
                int index = 0;
                ExEnum exEnum = new ExEnum(typeof(MyEnum));
                foreach (MyEnum item in exEnum.Array)
                {
                    listBox1.Items.Add(string.Format("元素 [{0}]: {1}", index++, exEnum.Name(item)));
                }
                listBox1.Items.Add(string.Format("最大值: [{0}] ", exEnum.Max));
                listBox1.Items.Add(string.Format("最小值: [{0}]", exEnum.Min));        

     运行效果图:

     

    ------------------------------------------------------
    作者:沐汐 Vicky
    欢迎转载,但未经作者同意必须保留此段声明,否则保留追究法律责任的权利.
    ------------------------------------------------------
  • 相关阅读:
    Java之泛型练习
    集合框架-Map练习-记录字母出现的次数
    集合框架Map之entrySet方法的使用
    集合框架Map之KeySet方法的使用
    Java集合框架之LinkedList-----用LinkedList模拟队列和堆栈
    springboot2.0+mycat实验读写分离
    mysql主从复制
    mycat读写分离
    kafka初探
    redis-List类型
  • 原文地址:https://www.cnblogs.com/EasyInvoice/p/6609589.html
Copyright © 2011-2022 走看看