zoukankan      html  css  js  c++  java
  • 枚举扩展方法

    枚举扩展方法

    namespace Infrastructure
    {
        /// <summary>
        /// 枚举扩展方法
        /// </summary>
        public static class EnumExtensions
        {
            public static int GetEnumValue(this object value)
            {
                return (int)value;
            }
    
            /// <summary>
            /// 获取枚举描述
            /// </summary>
            public static string GetDescription(this Enum value)
            {
                if (value == null)
                    return string.Empty;
                return GetDescriptionForEnum(value);
            }
    
            /// <summary>
            /// 获取描述
            /// </summary>
            /// <param name="value"></param>
            /// <returns></returns>
            public static string GetDescriptionForEnum(this object value)
            {
                if (value == null || string.IsNullOrEmpty(value.ToString()) || value.ToString()=="0") return string.Empty;
                var type = value.GetType();
                var field = type.GetField(Enum.GetName(type, value));
                if (field != null)
                {
                    var des = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute;
                    if (des != null)
                    {
                        return des.Description;
                    }
                }
                return value.ToString();
            }
    
            /// <summary>
            /// Enum装datatable
            /// </summary>
            /// <param name="enumType"></param>
            /// <param name="key"></param>
            /// <param name="val"></param>
            /// <returns></returns>
            public static DataTable ToDataTable(Type enumType, string key, string val)
            {
                string[] Names = Enum.GetNames(enumType);
    
                Array Values = Enum.GetValues(enumType);
    
                DataTable table = new DataTable();
                var colType = typeof(string);
                table.Columns.Add(key, colType);
                table.Columns.Add(val, colType);
                table.Columns[key].Unique = true;
                for (int i = 0; i < Values.Length; i++)
                {
                    var enumInfo = enumType.GetField(Names[i]);
                    var enumAttributes = (DescriptionAttribute[])enumInfo.
                        GetCustomAttributes(typeof(DescriptionAttribute), false);
    
                    DataRow DR = table.NewRow();
                    DR[key] = enumAttributes.Length > 0 ? enumAttributes[0].Description : Names[i];
                    try
                    {
                        DR[val] = (int)Values.GetValue(i);
                    }
                    catch (Exception)
                    {
                        DR[val] = (byte)Values.GetValue(i);
                    }
    
                    table.Rows.Add(DR);
                }
                return table;
            }
            /// <summary>
            /// 通过Flags枚举的值values获取对应的单独枚举集合
            /// </summary>
            /// <param name="values"></param>
            /// <returns></returns>
            public static IEnumerable<int> GetValueList(this Enum values)
            {
                var sourceValues = (int)(object)values;
    
                return Enum.GetValues(values.GetType())
                    .Cast<int>()
                    .Where(value => value > 0)
                    .Where(value => (value & sourceValues) == value);
            }
            public static IList<string> GetValueListString(this Enum values)
            {
                return values.GetValueList().Select(x => x.ToString()).ToList();
            }
    
            public static IList<SelectOption> GetValueListOption(this Enum values)
            {
                var sourceValues = (int)(object)values;
    
                var valueQuery = from value in Enum.GetValues(values.GetType()).Cast<object>()
                                 let intValue = (int)value
                                 where intValue > 0 && ((intValue & sourceValues) == intValue)
                                 select new SelectOption()
                                 {
                                     Value = intValue.ToString(),
                                     Text = value.GetDescriptionForEnum()
                                 };
    
                return valueQuery.ToList();
            }
    
            public static int OptionListToFlagEnum(this IList<SelectOption> valueList)
            {
                if (valueList == null || valueList.Count <= 0)
                    return 0;
    
                return valueList.Select(x => x.Value).Select(int.Parse).Sum();
            }
    
            public static int ValueListToFlagEnum(this IList<string> valueList)
            {
                if (valueList == null || valueList.Count <= 0)
                    return 0;
    
                return valueList.Select(int.Parse).Sum();
            }
    
            /// <summary>
            /// 根据Description获取枚举
            /// 说明:
            /// 单元测试-->通过
            /// </summary>
            /// <typeparam name="T">枚举类型</typeparam>
            /// <param name="description">枚举描述</param>
            /// <returns>枚举</returns>
            public static T GetEnumName<T>(string description)
            {
                Type _type = typeof(T);
                foreach (FieldInfo field in _type.GetFields())
                {
    
                    if (field == null)
                    {
                        if (field.Name == description)
                            return (T)field.GetValue(null);
                    }
    
                    var _curDesc = (DescriptionAttribute[])field.GetCustomAttributes(typeof(DescriptionAttribute), false);
                    if (_curDesc != null && _curDesc.Length > 0)
                    {
                        if (_curDesc[0].Description == description)
                        {
                            return (T)field.GetValue(null);
                        }
                    }
                }
                throw new ArgumentException(string.Format("{0} 未能找到对应的枚举.", description), "Description");
            }
    
            /// <summary>
            /// 将枚举转换为ArrayList
            /// 说明:
            /// 若不是枚举类型,则返回NULL
            /// 单元测试-->通过
            /// </summary>
            /// <param name="type">枚举类型</param>
            /// <returns>ArrayList</returns>
            public static IList<KeyValuePair<Enum, string>> ToArrayList(this Type type)
            {
                if (type.IsEnum)
                {
                    var _array = new List<KeyValuePair<Enum, string>>();
                    Array _enumValues = Enum.GetValues(type);
                    foreach (Enum value in _enumValues)
                    {
                        _array.Add(new KeyValuePair<Enum, string>(value, GetDescription(value)));
                    }
                    return _array;
                }
                return null;
            }
        }
    }
  • 相关阅读:
    史上最简单易懂的Android Pad手机屏幕适配方案
    Android平板开发
    Android TV 开发 (1)
    三大开源java区块链库
    将博客园数据导出到wordpress
    MQTT结构分析
    netty+mqtt
    安卓原生 VideoView实现rtsp流媒体的播放
    【矩阵专题】——矩阵加速
    征战蓝桥 —— 2016年第七届 —— C/C++A组第4题——快速排序
  • 原文地址:https://www.cnblogs.com/mc67/p/5919762.html
Copyright © 2011-2022 走看看