• 给枚举值增加扩展数据


    一般的每个枚举值对应着一个值, 而有时一个枚举值又具有其他的对应值或者需要有额外的扩展数据,这时我们怎么办?一种简单的方案是,可以定义一个以枚举值为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
        }
    获取扩展数据的结果如下图





    转载请注明出处

    源码下载


  • 相关阅读:
    浅析数据结构-图的遍历
    浅析数据结构-图的基本概念
    Huffman树及其应用
    浅谈数据结构-树和二叉树之间关系
    浅谈数据结构-二叉树
    input只能输入数字和小数点,并且只能保留小数点后两位
    API安全验证之JWT(JSON WEB TOKEN) OLCMS
    积土学吧功能梳理
    Adding basic files · lcobucci/jwt@aad22ed · GitHub
    GitHub
  • 原文地址:https://www.cnblogs.com/sparkleDai/p/7604910.html
Copyright © 2020-2023  润新知