背景

接触过的语言中,C#(.NET 平台的多数语言都支持)、Java 和 Python 都支持这个特性,本文重点介绍 C# 中的应用,这里简单的对 C#、java 和 Python 中的 Attribute 做个总结:

  • C#:可以封装状态和行为,会作为元数据存储在程序集中,会关联某些语言结构,可以运行时读取。
  • Java:只能封装状态(Java 中叫:Annotation),会作为元数据存储在程序集中,会关联某些语言结构,可以运行时读取(根据配置,某些 Annotation 只在存在编译时)。
  • Python:只是语言糖,算是一种工厂(Python 中叫 Detector),比如:装饰一个对象,然后返回一个代理。

后面谈到 Attribute 都是指 C# 中的 Attribute。

认识 Attribute

Attribute 是一种类型,这种类型封装了一些元数据(状态)和行为,Attribute 可以应用在某些级别的语言结构上(程序集、类、方法、参数等等),Attribute 有如下用处:

  1. 影响编译器:

         [CLSCompliant]
    class Program
    {
    static void Main(string[] args)
    {
    }
    }

    注意:除了编译器开发团队可以开发这种 Attribute,其他人是不可能开发的。

  2. 影响运行时:
         [MTAThread]
    class Program
    {
    static void Main(string[] args)
    {
    }
    }

    注意:除了 CLR 开发团队可以开发这种 Attribute,其他人是不可能开发的,当然,如果 CLR 提供了一种机制,可以识别某个 Attribute 的子类的话,你也可以继承这个 Attribute 开发自己的子类了。

  3. 影响框架和应用程序:
     using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Web.Mvc; using Common.Logging;
    using Happy.ExceptionHanding;
    using Happy.Web.Mvc.Newtonsoft; namespace Happy.Web.Mvc.ExceptionHanding
    {
    /// <summary>
    /// 处理应用程序未捕获的异常。
    /// </summary>
    [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = true)]
    public class WriteExceptionResultAttribute : FilterAttribute, IExceptionFilter
    {
    /// <inheritdoc />
    public void OnException(ExceptionContext filterContext)
    {
    var exception = filterContext.Exception;
    if (!FriendlyExceptionRegistry.IsFriendly(exception.GetType()))
    {
    LogManager.GetCurrentClassLogger().Error(exception);
    }
    filterContext.Result = CreateErrorResult(exception);
    filterContext.ExceptionHandled = true;
    } private static ActionResult CreateErrorResult(Exception exception)
    {
    var information = ExceptionInformationProviderRegistry.CreateInformation(exception); return new NewtonsoftJsonResult
    {
    Data = information
    };
    }
    }
    }

    注意:之所以可以开发这个 Attribute,是因为 ASP.NET MVC 提供了这种机制,它的内部实现会在运行时反射这种(实现了某个基类)Attribute,然后根据 Attribute 的元数据执行某些逻辑,或者调用 Attribute 的行为。

开发自定义 Attribute

参考文章:http://www.cnblogs.com/hyddd/archive/2009/07/20/1526777.html

.NET:Attribute 入门(内训教程)的更多相关文章

  1. Spring Boot 2.0 的快速入门(图文教程)

    摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! Spring Boot 2.0 的快速入门(图文教程) 大家都 ...

  2. C#中的特性 (Attribute) 入门 (一)

    C#中的特性 (Attribute) 入门 (一) 饮水思源 http://www.cnblogs.com/Wind-Eagle/archive/2008/12/10/1351746.html htt ...

  3. react 入门与进阶教程

    react 入门与进阶教程 前端学习对于我们来说越来越不友好,特别是随着这几年的发展,入门门槛越来越高,连进阶道路都变成了一场马拉松.在学习过程中,我们面临很多选择,vue与react便是一个两难的选 ...

  4. MyBatis学习总结-MyBatis快速入门的系列教程

    MyBatis学习总结-MyBatis快速入门的系列教程 [MyBatis]MyBatis 使用教程 [MyBatis]MyBatis XML配置 [MyBatis]MyBatis XML映射文件 [ ...

  5. 深圳市共创力咨询为某大型上市企业提供两天的UCD内训与辅导服务!

    2017年5月23和24日两天,深圳市共创力咨询为国内某大型上市企业提供了为期两天的内训与辅导服务.本次执行培训与辅导任务的是UCD(基于用户体验的设计)资深顾问蔷薇女士.蔷薇老师分别从UCD理论.U ...

  6. 2014年11月17~11月18日,杨学明老师《企业IT需求收集和实施》内训在湖南长沙某酒店成功举办!

    2014年11月17至18日,受湖南某软件企业的邀请,杨学明老师<企业IT需求收集和实施>内训在某长沙某五星级酒店成功举办!来自全国各地的IT高管和企业负责人参加了此次培训.杨学明老师分别 ...

  7. 2014年5月16至24日,杨学明老师为深圳创维RGB事业部提供两天的《软件测试管理》内训服务!

    2014年5月16日和24日,<在软件开发流程中构筑软件质量—软件测试管理>内训课程在深圳创维集团成功举办!来自创维研发.测试.生产等部门的管理人员和核心骨干等参加了此次培训,此次培训由研 ...

  8. Atitit 华为管理者内训书系 以奋斗者为本 华为公司人力资源管理纲要 attilax读后感

    Atitit  华为管理者内训书系 以奋斗者为本 华为公司人力资源管理纲要 attilax读后感 序 言上篇:价值创造.评价与分配第一章 全力创造价值1.1 围绕价值创造展开人力资源管理1.1.1 什 ...

  9. 内训--2小时 Word精髓

    企业内部使用Word最常见就是用来写产品手册与合同,产品手册是书版(即可以出版,与买到的书类似),合同重点是修订.Word的精髓在于样式,或者说在企业办公使用,学会样式就可以了.什么域.宏.VBA几乎 ...

随机推荐

  1. 可视化并理解CNN

    参考:https://zhuanlan.zhihu.com/p/24833574 学习论文[1311.2901] Visualizing and Understanding Convolutional ...

  2. Python 爬虫入门之爬取妹子图

    Python 爬虫入门之爬取妹子图 来源:李英杰  链接: https://segmentfault.com/a/1190000015798452 听说你写代码没动力?本文就给你动力,爬取妹子图.如果 ...

  3. TcxGrid 复选框

  4. Hanoi Factorys

    题面 思路 这道题看似难的一匹,实际上也难的一批还好,甚至n^2 DP都有50分呢. 原谅我一失手成千古恨. 50分思路 就是sort后根据条件DP if (LIS[i].b>LIS[j].a) ...

  5. svn导入项目和部署方面的相关问题

    前一阵子忙于部署项目的事情,在这个过程之中遇到了一些问题,查阅了相关资料解决了问题于是就决定分享给大家,可能会对大家有一定的帮助.我在下面中可能会提到dubbo的一些问题,dubbo是用于分布式的系统 ...

  6. Dynamic Rankings || 动态/静态区间第k小(主席树)

    JYF大佬说,一星期要写很多篇博客才会有人看 但是我做题没有那么快啊QwQ Part1 写在前面 区间第K小问题一直是主席树经典题=w=今天的重点是动态区间第K小问题.静态问题要求查询一个区间内的第k ...

  7. 微信WeixinJSBridge的接口使用

    以下都要包含weixinApi.js(见底部git里的js文件) 1).分享 WeixinApi.ready(function(Api) { // 微信分享的数据 var wxData = { &qu ...

  8. 018 HDFS中,namenode与datanode的交互

    1.解释 2.启动过程 namenode需要等待给他汇报块的情况,然后namenode会给datanode一个反馈. namenode在启动的时候有一个等待的过程. 3.如果有块损坏 等待报告中,na ...

  9. java okhttp 发送图片

    @RequestMapping(value="/demo2", method=RequestMethod.POST) @ResponseBody public String dem ...

  10. rabbitmq学习(六) —— 主题

    主题交换(Topic exchange) 使用 topic 类型的交换器,不能有任意的绑定键,它必须是由点隔开的一系列的标识符组成.标识符可以是任何东西,但通常它们指定与消息相关联的一些功能.其中,有 ...