1. 程式人生 > >C# 列舉操作工具類

C# 列舉操作工具類

<span style="font-size:14px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.ComponentModel;
using System.Collections;
using System.Collections.Specialized;

namespace JianKunKing.Common.EnumClass
{
    /// <summary>
    /// 列舉操作類
    /// </summary>
    public static class EnumOperation
    {
        #region 從列舉中獲取Description
        /// <summary>
        /// 從列舉中獲取Description
        /// </summary>
        /// <param name="enumName">需要獲取列舉描述的列舉</param>
        /// <returns>描述內容</returns>
        public static string GetDescription(Enum enumName)
        {
            try
            {
                string _description = string.Empty;
                FieldInfo _fieldInfo = enumName.GetType().GetField(enumName.ToString());
                DescriptionAttribute[] _attributes = GetDescriptAttr(_fieldInfo);
                if (_attributes != null && _attributes.Length > 0)
                {
                    _description = _attributes[0].Description;
                }
                else
                {
                    _description = enumName.ToString();
                }
                return _description;
            }
            catch (Exception)
            {
                throw;
            }
        }
        #endregion

        #region 獲取欄位Description(private)
        /// <summary>
        /// 獲取欄位Description
        /// </summary>
        /// <param name="fieldInfo">FieldInfo</param>
        /// <returns>DescriptionAttribute[] </returns>
        private static DescriptionAttribute[] GetDescriptAttr(this FieldInfo fieldInfo)
        {
            try
            {
                if (fieldInfo != null)
                {
                    return (DescriptionAttribute[])fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false);
                }
                return null;
            }
            catch (Exception)
            {
                throw;
            }
        }
        #endregion

        #region 根據Description獲取列舉定義字串
        /// <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())
            {
                DescriptionAttribute[] _curDesc = field.GetDescriptAttr();
                if (_curDesc != null && _curDesc.Length > 0)
                {
                    if (_curDesc[0].Description == description)
                    {
                        return (T)field.GetValue(null);
                    }
                }
                else
                {
                    if (field.Name == description)
                    {
                        return (T)field.GetValue(null);
                    }
                }
            }
            throw new ArgumentException(string.Format("{0} 未能找到對應的列舉.", description), "Description");
        }
        #endregion

        #region 將列舉轉換為ArrayList
        /// <summary>
        /// 將列舉轉換為ArrayList
        /// 說明:
        /// 若不是列舉型別,則返回NULL
        /// </summary>
        /// <param name="type">列舉型別</param>
        /// <returns>ArrayList</returns>
        public static ArrayList ToArrayList(Type type)
        {
            try
            {
                if (type.IsEnum)
                {
                    ArrayList _array = new ArrayList();
                    Array _enumValues = Enum.GetValues(type);
                    foreach (Enum value in _enumValues)
                    {
                        _array.Add(new KeyValuePair<Enum, string>(value, GetDescription(value)));
                    }
                    return _array;
                }
                return null;
            }
            catch (Exception)
            {
                throw;
            }
        }
        #endregion

        #region 根據列舉值得到屬性Description中的描述, 如果沒有定義此屬性則返回空串
        /// <summary>  
        /// 根據列舉值得到屬性Description中的描述, 如果沒有定義此屬性則返回空串  
        /// </summary>  
        /// <param name="value"></param>  
        /// <param name="enumType"></param>  
        /// <returns></returns>  
        public static String GetEnumDescriptionString(int value, Type enumType)
        {
            try
            {
                NameValueCollection nvc = GetNVCFromEnumValue(enumType);
                return nvc[value.ToString()];
            }
            catch (Exception)
            {
                throw;
            }
        }
        #endregion

        #region 根據列舉型別得到其所有的值 與 列舉定義Description屬性 的集合
        /// <summary>  
        /// 根據列舉型別得到其所有的 值 與 列舉定義Description屬性 的集合  
        /// </summary>  
        /// <param name="enumType"></param>  
        /// <returns></returns>  
        public static NameValueCollection GetNVCFromEnumValue(Type enumType)
        {
            try
            {
                NameValueCollection nvc = new NameValueCollection();
                Type typeDescription = typeof(DescriptionAttribute);
                System.Reflection.FieldInfo[] fields = enumType.GetFields();
                string strText = string.Empty;
                string strValue = string.Empty;
                foreach (FieldInfo field in fields)
                {
                    if (field.FieldType.IsEnum)
                    {
                        strValue = ((int)enumType.InvokeMember(field.Name, BindingFlags.GetField, null, null, null)).ToString();
                        object[] arr = field.GetCustomAttributes(typeDescription, true);
                        if (arr.Length > 0)
                        {
                            DescriptionAttribute aa = (DescriptionAttribute)arr[0];
                            strText = aa.Description;
                        }
                        else
                        {
                            strText = "";
                        }
                        nvc.Add(strValue, strText);
                    }
                }
                return nvc;
            }
            catch (Exception)
            {
                throw;
            }
        }
        #endregion

        #region 根據列舉值得到相應的列舉定義字串
        /// <summary>  
        ///根據列舉值得到相應的列舉定義字串  
        /// </summary>  
        /// <param name="value"></param>  
        /// <param name="enumType"></param>  
        /// <returns></returns>  
        public static String GetEnumString(int value, Type enumType)
        {
            try
            {
                NameValueCollection nvc = GetEnumStringFromEnumValue(enumType);
                return nvc[value.ToString()];
            }
            catch (Exception)
            {
                throw;
            }
        }
        #endregion

        #region 根據列舉型別得到其所有的 值 與 列舉定義字串 的集合
        /// <summary>  
        /// 根據列舉型別得到其所有的 值 與 列舉定義字串 的集合  
        /// </summary>  
        /// <param name="enumType"></param>  
        /// <returns></returns>  
        public static NameValueCollection GetEnumStringFromEnumValue(Type enumType)
        {
            try
            {
                NameValueCollection nvc = new NameValueCollection();
                Type typeDescription = typeof(DescriptionAttribute);
                System.Reflection.FieldInfo[] fields = enumType.GetFields();
                string strText = string.Empty;
                string strValue = string.Empty;
                foreach (FieldInfo field in fields)
                {
                    if (field.FieldType.IsEnum)
                    {
                        strValue = ((int)enumType.InvokeMember(field.Name, BindingFlags.GetField, null, null, null)).ToString();
                        nvc.Add(strValue, field.Name);
                    }
                }
                return nvc;
            }
            catch (Exception)
            {
                throw;
            }
        }
        #endregion
    }
}</span>

如果知道列舉的編號就是那個int型別的數字,獲取name直接強轉就可以 (列舉型別)(int值)

小注:
       對於基礎公共方法類來說,其中最好不是獲取異常直接丟擲,切記不要吞掉或者只丟擲部分資訊。

異常部分可以參考:點選開啟連結

本人蔘考:http://blog.csdn.net/yenange/article/details/7788332