当前位置: 首页 > news >正文

使用attribute + 扩展方法完成 enum中field的信息映射

attribute可用来做信息映射,比起Dictionary或者Tuple,attribute显得更灵活,解耦,并可对应多种类型

以下是一个enum中的field的信息映射


1. 创建field attribute


 [AttributeUsage(AttributeTargets.Field)]
    public class JobActionMetadatAttribute : Attribute
    {
        public JobActionUIType UIType { get; private set; }
        public string Label { get; private set; }


        public JobActionMetadatAttribute(JobActionUIType uiType, string label)
        {
            UIType = uiType;
            Label = label;
        }
    }



2.准备一个extension 方法



  
  public static class JobActionExtenssion
    {
        public static JobActionMetadata GetMetaData(this JobAction jobAction)
        {
            var attr = Attribute.GetCustomAttribute(jobAction.GetType().GetMember(jobAction.ToString())[0],
                typeof(JobActionMetadatAttribute));


            if (attr != null)
            {
                var props = attr.GetType().GetProperties();
                JobActionUIType uiType;
                var uiTypeObj = props.FirstOrDefault(p => p.PropertyType == typeof(JobActionUIType));


                if (uiTypeObj == null)
                {
                    throw new InvalidDataException(string.Format("Failed to find JobActionUIType Property in JobActionMetadataAttribute"));
                }


                var uiTypeStr = uiTypeObj.GetValue(attr, null).ToString();


                if (!Enum.TryParse(uiTypeStr, true, out uiType))
                {
                    throw new InvalidEnumArgumentException(string.Format("Enum Parsing failed. string : {0}", uiTypeStr));
                }


                var label = props.First(p => p.Name == "Label").GetValue(attr, null).ToString();


                return new JobActionMetadata(jobAction, uiType, label, "");
            }
            throw new InvalidDataException(string.Format("Failed to find JobActionMetadatAttribute for Action : {0}", jobAction));
        }


    }



3. 在enum的field上应用特性


 public enum JobAction
    {
        [JobActionMetadatAttribute(JobActionUIType.Success, "Paypal Payment")]
        MakePayPalSimplePayment = 0,


        [JobActionMetadatAttribute(JobActionUIType.Success, "Pay by Free Pass")]
        MakeFreePassPayment = 1,


        [JobActionMetadatAttribute(JobActionUIType.Success, "Pay by Company Credit")]
        MakeCompanyCreditPayment = 2,
    }



4. 使用

job.JobAction.GetMetaData();


相关文章:

  • 什么是软件项目的成功
  • 在Asp.net MVC 使用bootstrap 的modal dialog 实现Popup
  • VS.NET中解决方案管理器中看不到解决方案节点的解决办法
  • MVC 中使用TreeView
  • .Net的DataSet直接与SQL2005交互
  • MVC4 使用 bootstrap daterangepicker
  • bootstrap 的 collapse 使用示例
  • 【精典】教你如何玩转触控S60诺基亚5800
  • ASP.NET MVC 中 如何将同一个form post到不同的action
  • 日本软件公司 管理者 改善 流程
  • C#委托和事件,ObServer模式实例代码
  • Mysql中文乱码的解决方法
  • 关于功能的设计
  • 清楚数据库中的全部数据并将ID归零
  • Java Web项目开发到底需要掌握哪些技术?
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • 【Linux系统编程】快速查找errno错误码信息
  • Android开源项目规范总结
  • DataBase in Android
  • es6要点
  • Laravel 中的一个后期静态绑定
  • Redis中的lru算法实现
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • vue的全局变量和全局拦截请求器
  • yii2权限控制rbac之rule详细讲解
  • 初识 webpack
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 官方解决所有 npm 全局安装权限问题
  • 前端面试之CSS3新特性
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 微信开源mars源码分析1—上层samples分析
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • 再谈express与koa的对比
  • const的用法,特别是用在函数前面与后面的区别
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ​比特币大跌的 2 个原因
  • "无招胜有招"nbsp;史上最全的互…
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • ${ }的特别功能
  • ( 10 )MySQL中的外键
  • (4.10~4.16)
  • (a /b)*c的值
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (二)Eureka服务搭建,服务注册,服务发现
  • (二)PySpark3:SparkSQL编程
  • (二)windows配置JDK环境
  • (附源码)ssm码农论坛 毕业设计 231126
  • (论文阅读40-45)图像描述1
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .NET 设计一套高性能的弱事件机制
  • .net 中viewstate的原理和使用
  • @RestControllerAdvice异常统一处理类失效原因
  • @取消转义