·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> 网站建设开发 >> ASP.NET网站开发 >> [C#]EnumHelper

[C#]EnumHelper

作者:佚名      ASP.NET网站开发编辑:admin      更新时间:2022-07-23
using System;
using System.ComponentModel;
using System.Reflection;

namespace LH.DotNet2.Utilities.Common
{
    /// <summary>
    /// 枚举帮助类
    /// </summary>
    public static class EnumHelper
    {
        #region 私有方法

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

        #endregion 私有方法

        /// <summary>
        ///判断枚举是否包括枚举常数名称
        /// </summary>
        /// <typeparam name="T">枚举</typeparam>
        /// <param name="enumName">枚举常数名称</param>
        /// <returns>是否包括枚举常数名称</returns>
        /// 创建  人:言志伟
        /// 创建时间:2015-06-04 17:17
        /// 备注说明:<c>null</c>
        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>
        /// 创建  人:言志伟
        /// 创建时间:2015-06-05 9:16
        /// 备注说明:<c>null</c>
        public static T ParseEnumName<T>(this string enumName) where T : struct, IConvertible
        {
            return (T)Enum.Parse(typeof(T), enumName, true);
        }
    }
}

单元测试:

using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace YanZhiwei.DotNet2.Utilities.Common.Tests
{
    public enum AreaMode
    {
        NONE,
        CITY,
        TOWN,
        ROAD,
        CITYTOWN,
        TOWNROAD,
        CITYROAD,
        ALL
    }

    [TestClass()]
    public class EnumHelperTests
    {
        [TestMethod()]
        public void CheckedContainEnumNameTest()
        {
            Assert.IsTrue(EnumHelper.CheckedContainEnumName<AreaMode>("none"));
        }

        [TestMethod()]
        public void GetDescriptionTest()
        {
            Assert.AreEqual("NONE", AreaMode.NONE.GetDescription());
        }

        [TestMethod()]
        public void ParseEnumDescriptionTest()
        {
            Assert.AreEqual(AreaMode.NONE, EnumHelper.ParseEnumDescription<AreaMode>("NONE", AreaMode.CITYTOWN));
        }

        [TestMethod()]
        public void ParseEnumNameTest()
        {
            Assert.AreEqual(AreaMode.ALL, EnumHelper.ParseEnumName<AreaMode>("ALL"));
        }
    }
}

image