Attribute特性可以说是具有开创新的意义,因为一般的语言在被设计出来后,它所具有的能力就已经固定了。而借助Attribute特性,我们可以为C#已有的类型附加信息,既可以在编程时(design-time)附加(如代码描述)、也可以附加运行时(run-time)信息(如数据库字段映射)、还可以使用Attribute控制代码的行为(如权限检查)。Attribute可以提供无限的可能。

一 Attribute的声明

在使用Attribute标签之前,首先要定义它

上面的代码就是Attribute的声明方式,[RegistryKey]标签的背后是一个继承了System.Attribute的类RegistryKeyAttribute,类的构造函数有两个参数,那么使用时也要对应传递两个参数

约定Attribute声明时类名称使用***Attribute,以Attribute结尾,在使用时则可以省去结尾的Attribute。

二 Attribute的使用

为了查找附加在一个类型上的Attribute,需要用反射的方式。

a) 类上的Attribute

定义一个Attribute如下

然后在MyRemoteableClass标记

那么,RemoteObjectAttribute的使用方式就可以是这样的。

使用typeof获取到类型后,使用.GetCustomAttributes()方法可以获取所有附加的Attribute

b) 方法上的Attribute

比如有一个TransactionableAttribute标记在方法上。

使用方式与类的有区别

获取到type后,还要用type.GetMethods()获取到类内部的方法的MethodInfo,然后再使用GetCustomAttributes。

c) 字段上的Attribute

同理,需要先使用type.GetFields()获取到所有字段的FieldInfo。

三 Attribute的参数

a) 在前面的RegistryKeyAttribute,使用了两个参数。

但如果有的参数不是经常变化,就可以改造成命名参数(named parameter),例如第一个参数,可以从构造函数,改成属性,如果需要改变时,可单独为其设置值。

需要注意的是,命名参数必须放在固定参数的后面,固定参数也不能采用类似命名参数的写法,因为编译器的处理方式是找到命名参数,然后将剩下的参数作为固定参数,如果固定参数也按照命名参数来写,编译器就不知道为构造函数怎么赋值了。命名参数的方式可以访问的类型包括所有公开的字段或属性,还包括setter方法,但这些都不能是被static或const修饰的。

b) Attribute参数可使用的类型包括值类型、System.Type、.object、枚举、一维数组(数组元素的类型只能属于前面列举的类型),但不能是类(class)。因为Attribute在编码时就被使用,那是是没有实例化的类的。

《Inside C#》笔记(七) Attribute的更多相关文章

  1. 《MFC游戏开发》笔记七 游戏特效的实现(一):背景滚动

    本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9344721 作者:七十一雾央 新浪微博:http:// ...

  2. (转)Qt Model/View 学习笔记 (七)——Delegate类

    Qt Model/View 学习笔记 (七) Delegate  类 概念 与MVC模式不同,model/view结构没有用于与用户交互的完全独立的组件.一般来讲, view负责把数据展示 给用户,也 ...

  3. Learning ROS for Robotics Programming Second Edition学习笔记(七) indigo PCL xtion pro live

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS forRobotics Pro ...

  4. Elasticsearch笔记七之setting,mapping,分片查询方式

    Elasticsearch笔记七之setting,mapping,分片查询方式 setting 通过setting可以更改es配置可以用来修改副本数和分片数. 1:查看,通过curl或浏览器可以看到副 ...

  5. Typescript 学习笔记七:泛型

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  6. python3.4学习笔记(七) 学习网站博客推荐

    python3.4学习笔记(七) 学习网站博客推荐 深入 Python 3http://sebug.net/paper/books/dive-into-python3/<深入 Python 3& ...

  7. Go语言学习笔记七: 函数

    Go语言学习笔记七: 函数 Go语言有函数还有方法,神奇不.这有点像python了. 函数定义 func function_name( [parameter list] ) [return_types ...

  8. iOS 学习笔记七 【博爱手把手教你使用2016年gitHub Mac客户端】

    iOS 学习笔记七 [博爱手把手教你使用gitHub客户端] 第一步:首先下载git客户端 链接:https://desktop.github.com 第二步:fork 大神的代码[这里以我的代码为例 ...

  9. 【opencv学习笔记七】访问图像中的像素与图像亮度对比度调整

    今天我们来看一下如何访问图像的像素,以及如何改变图像的亮度与对比度. 在之前我们先来看一下图像矩阵数据的排列方式.我们以一个简单的矩阵来说明: 对单通道图像排列如下: 对于双通道图像排列如下: 那么对 ...

随机推荐

  1. Go标准库之读写文件(File)

    Go标准库之读写文件(File) 创建一个空文件 package main import ( "log" "os" ) func main() { file, ...

  2. 【LeetCode】1. 两数之和

    题目 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标.你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样 ...

  3. laravel5实现第三方登录(微信)

    背景 最近手头一个项目需要实现用户在网站的第三方登录(微信和微博),后端框架laravel5.4. 实现过程以微信网页版第三方登录,其他于此类似,在此不做重复. 准备工作 网站应用微信登录是基于OAu ...

  4. C# datagridview分页功能

    winform开发是或多或少都会接触datagridview控件,如果数据量大,那么必须使用分页功能,但是datagridview自身并没有分页,所以我们要自己实现.在网上搜了一些发现没有太适合自己的 ...

  5. thymeleaf 的使用

    thymeleaf 语法详解1.变量输出: th:text :在页面中输出某个值 th:value :将一个值放到input标签中的value中.2.判断字符串是否为空 ①:调用内置对象一定要用# ② ...

  6. aliyun阿里云Maven仓库配置

    maven仓库用过的人都知道,国内有多么的悲催.还好有比较好用的镜像可以使用,尽快记录下来.速度提升100倍. http://maven.aliyun.com/nexus/#view-reposito ...

  7. Docker容器绑定外部IP和端口

    Docker允许通过外部访问容器或者容器之间互联的方式来提供网络服务. 以下操作通过myfirstapp镜像模拟,如何制作myfirstapp镜像请点击此处. 1.外部访问容器容器启动之后,容器中可以 ...

  8. hashCode()方法和equal()方法的区别

    本文参考地址:http://www.cnblogs.com/zgq0/p/9000801.html hashCode()方法和equal()方法的作用其实一样,在Java里都是用来对比两个对象是否相等 ...

  9. .Net实现微信公众平台开发接口(二) 之 “获取access_token”

    access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token. 接口调用请求说明 http请求方式: GET https://api.weixin.qq.com/ ...

  10. DotNetty项目基本了解和介绍

    一.DotNetty背景介绍 DotNetty是微软的Azure团队,使用C#实现的Netty的版本发布.不但使用了C#和.Net平台的技术特点,并且保留了Netty原来绝大部分的编程接口.让我们在使 ...