介紹一個.NET枚舉共用類

using System;
using System.ComponentModel;
using System.Reflection;

namespace Common
{
    /**//// <summary>
    /// 枚舉幫助類
    /// </summary>
    public static class EnumHelper
    {

        private static DescriptionAttribute[] GetDescriptAttr(this FieldInfo fieldInfo)
        {
            if (fieldInfo != null)
            {
                return (DescriptionAttribute[])fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false);
            }
            return null;
        }


        /**//// <summary>
        ///判斷枚舉是否包括枚舉常數名稱
        /// </summary>
        /// <typeparam name="T">枚舉</typeparam>
        /// <param name="enumName">枚舉常數名稱</param>
        /// <returns>是否包括枚舉常數名稱</returns>

        public static bool CheckedContainEnumName<T>(string enumName) where T : struct, IConvertible
        {
            bool _result = false;
            if (typeof(T).IsEnum)
            {
                string[] _enumnName = Enum.GetNames(typeof(T));
                if (_enumnName != null)
                {
                    for (int i = 0; i < _enumnName.Length; i++)
                    {
                        if (string.Compare(_enumnName[i], enumName, true) == 0)
                        {
                            _result = true;
                            break;
                        }
                    }
                }
            }
            return _result;
        }

        /**//// <summary>
        /// 從枚舉中獲取Description
        /// </summary>
        /// <param name="targetEnum">須要獲取枚舉描述的枚舉</param>
        /// <returns>描述內容</returns>
        public static string GetDescription(this Enum targetEnum)
        {
            string _description = string.Empty;
            FieldInfo _fieldInfo = targetEnum.GetType().GetField(targetEnum.ToString());
            DescriptionAttribute[] _attributes = _fieldInfo.GetDescriptAttr();
            if (_attributes != null && _attributes.Length > 0)
                _description = _attributes[0].Description;
            else
                _description = targetEnum.ToString();
            return _description;
        }

        /**//// <summary>
        /// 根據Description獲取枚舉
        /// </summary>
        /// <typeparam name="T">枚舉類型</typeparam>
        /// <param name="description">枚舉描述</param>
        /// <returns>枚舉</returns>
        public static T ParseEnumDescription<T>(this string description, T defaultValue) where T : struct, IConvertible
        {
            if (typeof(T).IsEnum)
            {
                Type _type = typeof(T);
                foreach (FieldInfo field in _type.GetFields())
                {
                    DescriptionAttribute[] _description = field.GetDescriptAttr();
                    if (_description != null && _description.Length > 0)
                    {
                        if (string.Compare(_description[0].Description, description, true) == 0)
                        {
                            defaultValue = (T)field.GetValue(null);
                            break;
                        }
                    }
                    else
                    {
                        if (string.Compare(field.Name, description, true) == 0)
                        {
                            defaultValue = (T)field.GetValue(null);
                            break;
                        }
                    }
                }
            }
            return defaultValue;
        }

        /**//// <summary>
        /// 將枚舉常數名稱轉換成枚舉
        /// </summary>
        /// <typeparam name="T">枚舉</typeparam>
        /// <param name="enumName">枚舉常數名稱</param>
        /// <returns></returns>

        public static T ParseEnumName<T>(this string enumName) where T : struct, IConvertible
        {
            return (T)Enum.Parse(typeof(T), enumName, true);
        }
    }
}


   調用實例html


public enum AreaMode
    {
        NONE,
        CITY,
        TOWN,
        ROAD,
        CITYTOWN,
        TOWNROAD,
        CITYROAD,
        ALL
    }

    public class EnumHelperTests
    {
        public void CheckedContainEnumNameTest()
        {
            EnumHelper.CheckedContainEnumName<AreaMode>("none");
        }

        public void GetDescriptionTest()
        {
            AreaMode.NONE.GetDescription();
        }

        
        public void ParseEnumDescriptionTest()
        {
            EnumHelper.ParseEnumDescription<AreaMode>("NONE", AreaMode.CITYTOWN);
        }

        public void ParseEnumNameTest()
        {
            EnumHelper.ParseEnumName<AreaMode>("ALL");
        }
    }



   參考資料:介紹一個.NET枚舉共用類   http://www.studyofnet.com/news/1129.htmlc#

相關文章
相關標籤/搜索