给枚举值增加扩展数据

一般的每个枚举值对应着一个值, 而有时一个枚举值又具有其他的对应值或者需要有额外的扩展数据,这时我们怎么办?一种简单的方案是,可以定义一个以枚举值为KEY的字典,然后在Value中填入相应的值。当这个对应的值是固化的,那是不是一定要字典存储呢?是否可以在定义枚举的时候就进行定义呢?答案是有的。

.Net中有一种特别的类Attribute,继承自Attribute的类可以在枚举上直接添加相应的数据,比如常见的Description就是继承自Attribute,我们在定义枚举的时候,如果需要枚举对应相应的文字描述,可以这样定义。

public enum SwitchEnum
{
        [Description("打开")]
        Open,

        [Description("关闭")]
        Close
}
那我们要如何得到Description呢?可以通过反射。为了方便调用,我们写了一个针对枚举的扩展方法。

 public static class EnumExtension{//扩展方法必须写到静态类中
        /// <summary>
        /// 获取枚举值的描述文本
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        public static string FetchDescription(this Enum value)
        {
            FieldInfo fi = value.GetType().GetField(value.ToString());
            DescriptionAttribute[] attributes =
                  (DescriptionAttribute[])fi.GetCustomAttributes(
                  typeof(DescriptionAttribute), false);            
            return (attributes.Length > 0) ? attributes[0].Description : value.ToString();
        }
       }

有了获取描述的扩展方法后,当我们拿到枚举值时,比如SwitchEnujm.Open.FetchDescription()就可以得到描述的值【打开】。


基于该原理,那么如果我们自己 定义一个继承自Attribute的类,然后写一个对应的扩展方法,那是不是就可以了?是的。代码如下

 /// <summary>
    /// 枚举扩展数据特性
    /// </summary>
    public class EnumExtensionDataAttribute : Attribute
    {
        public object ExtensionData { get; set; }

        public EnumExtensionDataAttribute()
        {

        }

        public EnumExtensionDataAttribute(object extensionData)
        {
            ExtensionData = extensionData;
        }
    }
相应的扩展方法为

public static class EnumExtension
    {
        #region FetchExtensionData
        /// <summary>
        /// 获取枚举值的扩展数据
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        public static object FetchExtensionData(this Enum value)
        {
            FieldInfo fi = value.GetType().GetField(value.ToString());
            var attributes =
                  (EnumExtensionDataAttribute[])fi.GetCustomAttributes(
                  typeof(EnumExtensionDataAttribute), false);
            return (attributes.Length > 0) ? attributes[0].ExtensionData : null;
        }
        #endregion
    }
枚举值增加扩展数据

   public enum SwitchEnum
    {
        [EnumExtensionData("08:01-18:00")]
        [Description("打开")]
        Open,

        [EnumExtensionData("18:01-08:00")]
        [Description("关闭")]
        Close
    }
获取扩展数据的结果如下图





转载请注明出处

源码下载


原文地址:https://www.cnblogs.com/sparkleDai/p/7604910.html