.NET:Attribute 入门(内训教程)
背景
接触过的语言中,C#(.NET 平台的多数语言都支持)、Java 和 Python 都支持这个特性,本文重点介绍 C# 中的应用,这里简单的对 C#、java 和 Python 中的 Attribute 做个总结:
- C#:可以封装状态和行为,会作为元数据存储在程序集中,会关联某些语言结构,可以运行时读取。
- Java:只能封装状态(Java 中叫:Annotation),会作为元数据存储在程序集中,会关联某些语言结构,可以运行时读取(根据配置,某些 Annotation 只在存在编译时)。
- Python:只是语言糖,算是一种工厂(Python 中叫 Detector),比如:装饰一个对象,然后返回一个代理。
后面谈到 Attribute 都是指 C# 中的 Attribute。
认识 Attribute
Attribute 是一种类型,这种类型封装了一些元数据(状态)和行为,Attribute 可以应用在某些级别的语言结构上(程序集、类、方法、参数等等),Attribute 有如下用处:
- 影响编译器:
[CLSCompliant]
class Program
{
static void Main(string[] args)
{
}
}注意:除了编译器开发团队可以开发这种 Attribute,其他人是不可能开发的。
- 影响运行时:
[MTAThread]
class Program
{
static void Main(string[] args)
{
}
}注意:除了 CLR 开发团队可以开发这种 Attribute,其他人是不可能开发的,当然,如果 CLR 提供了一种机制,可以识别某个 Attribute 的子类的话,你也可以继承这个 Attribute 开发自己的子类了。
- 影响框架和应用程序:
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 入门(内训教程)的更多相关文章
- Spring Boot 2.0 的快速入门(图文教程)
摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! Spring Boot 2.0 的快速入门(图文教程) 大家都 ...
- C#中的特性 (Attribute) 入门 (一)
C#中的特性 (Attribute) 入门 (一) 饮水思源 http://www.cnblogs.com/Wind-Eagle/archive/2008/12/10/1351746.html htt ...
- react 入门与进阶教程
react 入门与进阶教程 前端学习对于我们来说越来越不友好,特别是随着这几年的发展,入门门槛越来越高,连进阶道路都变成了一场马拉松.在学习过程中,我们面临很多选择,vue与react便是一个两难的选 ...
- MyBatis学习总结-MyBatis快速入门的系列教程
MyBatis学习总结-MyBatis快速入门的系列教程 [MyBatis]MyBatis 使用教程 [MyBatis]MyBatis XML配置 [MyBatis]MyBatis XML映射文件 [ ...
- 深圳市共创力咨询为某大型上市企业提供两天的UCD内训与辅导服务!
2017年5月23和24日两天,深圳市共创力咨询为国内某大型上市企业提供了为期两天的内训与辅导服务.本次执行培训与辅导任务的是UCD(基于用户体验的设计)资深顾问蔷薇女士.蔷薇老师分别从UCD理论.U ...
- 2014年11月17~11月18日,杨学明老师《企业IT需求收集和实施》内训在湖南长沙某酒店成功举办!
2014年11月17至18日,受湖南某软件企业的邀请,杨学明老师<企业IT需求收集和实施>内训在某长沙某五星级酒店成功举办!来自全国各地的IT高管和企业负责人参加了此次培训.杨学明老师分别 ...
- 2014年5月16至24日,杨学明老师为深圳创维RGB事业部提供两天的《软件测试管理》内训服务!
2014年5月16日和24日,<在软件开发流程中构筑软件质量—软件测试管理>内训课程在深圳创维集团成功举办!来自创维研发.测试.生产等部门的管理人员和核心骨干等参加了此次培训,此次培训由研 ...
- Atitit 华为管理者内训书系 以奋斗者为本 华为公司人力资源管理纲要 attilax读后感
Atitit 华为管理者内训书系 以奋斗者为本 华为公司人力资源管理纲要 attilax读后感 序 言上篇:价值创造.评价与分配第一章 全力创造价值1.1 围绕价值创造展开人力资源管理1.1.1 什 ...
- 内训--2小时 Word精髓
企业内部使用Word最常见就是用来写产品手册与合同,产品手册是书版(即可以出版,与买到的书类似),合同重点是修订.Word的精髓在于样式,或者说在企业办公使用,学会样式就可以了.什么域.宏.VBA几乎 ...
随机推荐
- CRT软件光标不闪烁
点击 选项->会话选项 然后在取消即可,就有了闪烁的光标,应该是个bug 也可以把后面的浏览器之类的东西缩小一下,也会恢复
- dede列表页读取当前栏目名称
list或者arclist之内使用[field:typename/]之外使用{dede:field name='typename'/}
- JDK7的新玩具java.util.Objects
空指针异常这个坑爹的异常是初学开发者最常见的坑,那么今天为大家分享一个jdk的新工具java.util.Objects包.里面有很多工具可以帮我们避免空指针异常让我我们的代码写起来更加优雅.下面我们来 ...
- GeoHash解析及java实现
GeoHash解析请参考这里: http://www.open-open.com/lib/view/open1417940079964.html java实现GeoHash,代码已注释. import ...
- c++ primer 学习杂记1
读到p483 公有,私有,受保护的继承. 1.关于基类成员在派生类中的访问级别: 1) 无论何种继承方式, 派生类都无法访问基类中的private成员. 2) 派生类可以限制,而不能放松对所继承成员的 ...
- Asp.Net Mvc5 结合 SignalR2.0+ 实现消息交互简单例子
Nuget添加 SignalR包 1.构建一个MyHubServer服务端类 定义类的特性标签为 [HubName("chatHub")] public class MyHubSe ...
- activeMQ安全配置及常见问题解决
https://blog.csdn.net/dandan2zhuzhu/article/details/78461872
- Angular快速学习笔记(4) -- Observable与RxJS
介绍RxJS前,先介绍Observable 可观察对象(Observable) 可观察对象支持在应用中的发布者和订阅者之间传递消息. 可观察对象可以发送多个任意类型的值 -- 字面量.消息.事件. 基 ...
- 008 使用POJO对象绑定请求参数
1.介绍 2.Person.java package com.spring.bean; public class Person { private String username; private S ...
- SET操作符
一:MySQL交集INTERSECT运算符 1.介绍 INTERSECT运算符是一个集合运算符,它只返回两个查询或更多查询的交集. 语法: INTERSECT运算符比较两个查询的结果,并返回由左和右查 ...