使用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();
时间: 2024-10-25 01:53:03

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

C# 的扩展方法在 LINQ 中实现数组排序

首先定义一个数组,int[] a = { 3,1,2,4},我们要简单的实现该数组的排序,但是a数组是System空间下的,没有OrderBy()之类的方法,这是我们引入命名空间using System.Linq之后可以看见又该方法了.给个简单的例子如下: using System; using System.Linq; namespace 对象初始化器 { class Program { static void Main(string[] args) { int[] a = { 3,1,2,4

扩展方法是静态类中的静态方法

Ztree扩展方法汇总(更新中)

var treeObj = $.fn.zTree.getZTreeObj("tree_div"); //得到ztree对象 1.展开所有节点 treeObj.expandAll(true); 2.设置根节点展开 var treeObj = $.fn.zTree.getZTreeObj("tree_div"); var nodes = treeObj.getNodes(); for (var i = 0; i < nodes.length; i++) { //设

C#中的自动属性、隐式类型var、对象初始化器与集合初始化器、扩展方法

1.自动属性(Auto-Implemented Properties) //以前的写法 .net2.0 private string _userName; public string UserName { get { return _userName; } set { _userName= value; } } //现在 只适合3.5以上 public string_userName {get;set;} 2.隐式类型var 它是在编译已经能确定变量的类型,是根据后面的值自动推断类型,编译时把推

在C#中使用扩展方法

在我们的编程过程中,会使用各种类库,有自己写的,有的用别人的.当我们使用第三方的类库时,有时候为了使用方便,希望给类库增加一些Helper方法,这时候就要使用扩展方法了. 看看MSDN上的介绍:扩展方法使你能够向现有类型"添加"方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用. 通常,建议你只在不得已的情况下才实现扩展方法,并谨慎地实现. 只要有可能,必须扩展现有类型的客户端代码都应该通过创建从现有

【ASP.NET MVC 学习笔记】- 14 HtmlHlper的扩展方法

本文参考:http://www.cnblogs.com/willick/p/3428413.html 1.在 MVC 中用于生成 Html 元素的辅助类是 System.Web.Mvc 命名空间下的 HtmlHelper,习惯上我们把 HtmlHelper 中的(扩展)方法叫 HtmlHelper Method,简称为Helper Method.它的作用是把生成 Html代码的任务交给 MVC,以便 MVC 能完成很多自动处理的工作.我们在 View 中使用的 Html.ActionLink.H

部分类、静态类、Object类、ToString()方法、扩展方法的使用

部分类.静态类.Object类.ToString()方法.扩展方法的使用 一:部分类: 前言:partial关键字允许将类.结构.方法或者接口放在多个文件中.一般情况下,一个类全部驻留在单个文件中.但有时,多个开发人员需要访问同一类的时候,或者某种类型的代码生成器生成了一个类的某部分.所以把类放在多个文件中是有益的. 如果声明类时使用了下面的关键字.这些关键字就必须应用于同一个类中的所有的部分: public  private  protected  internal  abstract  se

通过扩展方法简化UnityAPI调用

通过扩展方法简化UnityAPI调用 扩展方法unity apiapi简化 通过扩展方法简化UnityAPI调用 能省一秒是一秒,时间就是金钱,没人愿意把时间花在冗长的coding上?? 定义扩展方法简化Transform中对位置的赋值 using UnityEngine; namespace WSFramework {  public static class TransformLocalPosImprovements {  public static void SetLocalPosX (t

扩展方法从简单应用到深入解析,读这一篇文章就够了

前言(扯淡-_-) 大家好,今天和大家聊聊扩展的事,我将带着大家从简单应用开始深入理解扩展方法的原理,并对扩展方法的使用给出合理的建议. 在实际应用中,当我们在使用某类时发现类中缺少我们想要的方法,最简单直接的就是修改类的源代码来添加我们想要的方法.但事实往往不如人意,总会因为各种因素不可以直接修改源码:拿不到源码.不允许修改,这时候通过继承并扩展的方式来复用是再好不过了,但是如果连最后的继承的权利都剥夺的话(密封类不允许继承)?...这时候就需要用到[扩展方法]了. 扩展方法简介 我们先来看看