• Enum Helper


      public static class EnumHelper
        {
            #region get
    
            /// <summary>
            ///  获得枚举类型所包含的全部项的列表
            /// </summary>
            /// <param name="enumType">枚举的类型</param>
            /// <returns></returns>
            public static List<EnumItem> GetEnumItems(Type enumType)
            {
                return GetEnumItems(enumType, false);
            }
    
            /// <summary>
            /// 获得枚举类型所包含的全部项的列表,包含"All"。
            /// </summary>
            /// <param name="enumType">枚举对象类型</param>
            /// <returns></returns>
            public static List<EnumItem> GetEnumItemsWithAll(Type enumType)
            {
                return GetEnumItems(enumType, true);
            }
    
            /// <summary>
            /// 获得枚举类型所包含的全部项的列表
            /// </summary>
            /// <param name="enumType">枚举对象类型</param>
            /// <param name="withAll">是否需要包含'All'</param>
            /// <returns></returns>
            public static List<EnumItem> GetEnumItems(Type enumType, bool withAll)
            {
                List<EnumItem> list = new List<EnumItem>();
    
                if (enumType.IsEnum != true)
                {
                    //whether the type is enum type
                    throw new InvalidOperationException();
                }
    
                if (withAll == true)
                    list.Add(new EnumItem(-1, "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;
            }
    
            /// <summary>
            /// the the enum value's descrption attribute information
            /// </summary>
            /// <param name="enumType">the type of the enum</param>
            /// <param name="value">the enum value</param>
            /// <returns></returns>
            public static string GetDescriptionByEnum<T>(T t)
            {
                if (t == null)
                {
                    return null;
                }
                Type enumType = typeof(T);
                List<EnumItem> list = GetEnumItems(enumType);
                foreach (EnumItem item in list)
                {
                    if (Convert.ToInt32(item.Key) == Convert.ToInt32(t))
                        return item.Value.ToString();
                }
                return string.Empty;
            }
    
            public static string GetDescriptionByEnum(object t)
            {
                if (t == null)
                {
                    return string.Empty;
                }
                Type enumType = t.GetType();
                List<EnumItem> list = GetEnumItems(enumType);
                foreach (EnumItem item in list)
                {
                    if (Convert.ToInt32(item.Key) == Convert.ToInt32(t))
                        return item.Value.ToString();
                }
                return string.Empty;
            }
    
            /// <summary>
            /// get the enum value's int mode value
            /// </summary>
            /// <param name="enumType">the type of the enum</param>
            /// <param name="value">the enum value's descrption</param>
            /// <returns></returns>
            public static int GetValueByDescription<T>(string description)
            {
                Type enumType = typeof(T);
                List<EnumItem> list = GetEnumItems(enumType);
                foreach (EnumItem item in list)
                {
                    if (item.Value.ToString().ToLower() == description.Trim().ToLower())
                        return Convert.ToInt32(item.Key);
                }
                return -1;
            }
    
    
            /// <summary>
            /// get the Enum value according to the its decription
            /// </summary>
            /// <param name="enumType">the type of the enum</param>
            /// <param name="value">the description of the EnumValue</param>
            /// <returns></returns>
            public static T GetEnumByDescription<T>(string description)
            {
                if (description == null)
                {
                    return default(T);
                }
                Type enumType = typeof(T);
                List<EnumItem> list = GetEnumItems(enumType);
                foreach (EnumItem item in list)
                {
                    if (item.Value.ToString().ToLower() == description.Trim().ToLower())
                        return (T)item.Key;
                }
                return default(T);
            }
            /// <summary>
            /// get the description attribute of a Enum value
            /// </summary>
            /// <param name="enumType">the type of the enum</param>
            /// <param name="value">enum value name</param>
            /// <returns></returns>
            public static T GetEnumByName<T>(string name)
            {
                Type enumType = typeof(T);
                List<EnumItem> list = GetEnumItems(enumType);
                bool flag = false;
                foreach (EnumItem item in list)
                {
                    if (item.Value.ToString().ToLower() == name.Trim().ToLower())
                    {
                        flag = true;
                        return (T)item.Key;
                    }
                }
                if (!flag)
                {
                    throw new ArgumentException("Can not found specify the name of the enum", "name");
                }
                return default(T);
            }
    
            public static T GetEnumByValue<T>(object value)
            {
                bool flag = false;
                if (value == null)
                    throw new ArgumentNullException("value");
                try
                {
                    Type enumType = typeof(T);
                    List<EnumItem> list = GetEnumItems(enumType);
                    foreach (EnumItem item in list)
                    {
                        if (item.Key.ToString().Trim().ToLower() == value.ToString().Trim().ToLower())
                        {
                            flag = true;
                            return (T)item.Key;
                        }
                    }
                    if (!flag)
                    {
                        throw new ArgumentException("Can not found specify the value of the enum", "value");
                    } 
                    return default(T);
                }
                catch
                {
                    return default(T);
                }
            }
            public static int? GetValueByEnum(object value)
            {
                if (value == null)
                    return null;
                try
                {
                    return (int)value;
                }
                catch
                {
                    return null;
                }
            }
    
            #endregion 
    
    
            #region Parse Enum
            /// <summary>
            /// 提供Value的字符,转换为对应的枚举对象
            /// <remarks>适用于枚举对象值定义为Char类型的</remarks>
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="c"></param>
            /// <returns></returns>
            public static T Parse<T>(char c) where T : struct
            {
                return Parse<T>((ulong)c);
            }
    
            /// <summary>
            /// 提供Value的字符,转换为对应的枚举对象
            /// <remarks>适用于枚举对象值定义为Int类型的</remarks>
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="l"></param>
            /// <returns></returns>
            public static T Parse<T>(ulong l) where T : struct
            {
                if (!typeof(T).IsEnum)
                {
                    throw new ArgumentException("Need System.Enum as generic type!");
                }
    
                object o = Enum.Parse(typeof(T), l.ToString());
                if (Enum.IsDefined(typeof(T), o))
                {
                    return (T)o;
                }
    
                throw new InvalidCastException();
            }
    
            /// <summary>
            /// 提供Value的字符,转换为对应的枚举对象
            /// <remarks>适用于枚举对象值定义为Char类型的</remarks>
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="value"></param>
            /// <returns></returns>
            public static T Parse<T>(string value) where T : struct
            {
                if (value == null || value.Trim().Length != 1)
                {
                    throw new ArgumentException("Invalid cast,value must be one character!");
                }
    
                return Parse<T>(value[0]);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="c"></param>
            /// <param name="result"></param>
            /// <returns></returns>
            public static bool TryParse<T>(char c, out T result) where T : struct
            {
                return TryParse<T>((ulong)c, out result);
            }
    
            /// <summary>
            /// 
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="value"></param>
            /// <param name="result"></param>
            /// <returns></returns>
            public static bool TryParse<T>(string value, out T result) where T : struct
            {
                try
                {
                    if (value == null || value.Trim().Length != 1)
                    {
                        throw new ArgumentException("Invalid cast,value must be one character!");
                    }
    
                    return TryParse<T>(value[0], out result);
                }
                catch
                {
                    result = default(T);
                    return false;
                }
            }
    
            /// <summary>
            /// 
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="value"></param>
            /// <param name="result"></param>
            /// <returns></returns>
            public static bool TryParse<T>(ulong value, out T result) where T : struct
            {
                try
                {
                    result = Parse<T>(value);
                    return true;
                }
                catch
                {
                    result = default(T);
                    return false;
                }
            }
            #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;
            }
        }
  • 相关阅读:
    网络流模型之二分图匹配问题
    省选测试8
    省选测试9
    省选测试7
    省选测试6
    网络流最大流、最小割学习笔记
    kruskal重构树学习笔记
    省选测试5
    Python 打包成exe 方式
    JQuery
  • 原文地址:https://www.cnblogs.com/Wolfmanlq/p/4183428.html
Copyright © 2020-2023  润新知