enum扩展

enum概述:

    Msdnenum的说明:enum 关键字用于声明枚举,即一种由一组称为枚举数列表的命名常量组成的独特类型。每种枚举类型都有基础类型,该类型可以是除 char 以外的任何整型。枚举元素的默认基础类型为 int。默认情况下,第一个枚举数的值为 0,后面每个枚举数的值依次递增1

例如:enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};

 

enum扩展:

    在实际的使用中,我们常常希望枚举类型对应的基础类型是字符串类型的。如:enum Country{中国, 美国, 日本};如果Country.中国,那么对应的值是“China”,而不是整数0.

如何实现呢?Java中有Enum类可以实现类似功能,而C#Enum不允许继承,所以大家公认比较好的做法是使用.Net Framework3.5Attribute曲线救国。

 

实现思路:

1.  创建ItemDiscAttribute(继承自Attribute),实现自定义属性。

2.  创建enum时,为其子项设置自定义属性。

3.  Enum创建扩展方法,读取自定义属性,实现Enum和自定义属性的映射。

 

具体实现:

(一)自定义属性类ItemDiscAttribute

    [AttributeUsage(AttributeTargets.Field)]

    public class ItemDiscAttribute : Attribute

    {

        /// <summary>

        ///

        /// </summary>

        private string _Description;

 

        /// <summary>

        ///

        /// </summary>

        public string Description

        {

            get { return _Description; }

            set { _Description = Description; }

        }

 

        /// <summary>

        ///

        /// </summary>

        /// <param name="Description"></param>

        public ItemDiscAttribute(string Description)

        {

            _Description = Description;

        }

    }

 

(二)实现扩展方法:

    public static class EnumEx

    {

        private static Dictionary<Enum, string> dictDiscs = new Dictionary<Enum, string>();

        public static string Discription(this Enum myEnum)

        {

            string strDisc = string.Empty;

 

            if (dictDiscs.ContainsKey(myEnum))

            {

                strDisc = dictDiscs[myEnum];

            }

            else

            {

                strDisc = GetDiscription(myEnum);

                dictDiscs.Add(myEnum, strDisc);

            }

            return strDisc;

        }

 

        private static string GetDiscription(Enum myEnum)

        {

            FieldInfo fieldInfo = myEnum.GetType().GetField(myEnum.ToString());

            object[] attrs = fieldInfo.GetCustomAttributes(typeof(ItemDiscAttribute), true);

            if (attrs != null && attrs.Length > 0)

            {

                ItemDiscAttribute desc = attrs[0] as ItemDiscAttribute;

                if (desc != null)

                {

                    return desc.Description;

                }

            }

            return myEnum.ToString();

        }

    }

 

(三)用例:

 

    enum Country

    {

        [ItemDisc("China")]

        中国,

        [ItemDisc("USA")]

        美国,

        [ItemDisc("Japan")]

        日本

    };

 

    static void Main()

    {

        Console.WriteLine("Name=/"{0}/", Code=/"{1}/"", Country.中国.ToString(), Country.中国.Discription());

    }

 

(四)输出:

Name="中国", Code="China"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值