《Inside C#》笔记(七) Attribute
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的更多相关文章
- 《MFC游戏开发》笔记七 游戏特效的实现(一):背景滚动
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9344721 作者:七十一雾央 新浪微博:http:// ...
- (转)Qt Model/View 学习笔记 (七)——Delegate类
Qt Model/View 学习笔记 (七) Delegate 类 概念 与MVC模式不同,model/view结构没有用于与用户交互的完全独立的组件.一般来讲, view负责把数据展示 给用户,也 ...
- Learning ROS for Robotics Programming Second Edition学习笔记(七) indigo PCL xtion pro live
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS forRobotics Pro ...
- Elasticsearch笔记七之setting,mapping,分片查询方式
Elasticsearch笔记七之setting,mapping,分片查询方式 setting 通过setting可以更改es配置可以用来修改副本数和分片数. 1:查看,通过curl或浏览器可以看到副 ...
- Typescript 学习笔记七:泛型
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- python3.4学习笔记(七) 学习网站博客推荐
python3.4学习笔记(七) 学习网站博客推荐 深入 Python 3http://sebug.net/paper/books/dive-into-python3/<深入 Python 3& ...
- Go语言学习笔记七: 函数
Go语言学习笔记七: 函数 Go语言有函数还有方法,神奇不.这有点像python了. 函数定义 func function_name( [parameter list] ) [return_types ...
- iOS 学习笔记七 【博爱手把手教你使用2016年gitHub Mac客户端】
iOS 学习笔记七 [博爱手把手教你使用gitHub客户端] 第一步:首先下载git客户端 链接:https://desktop.github.com 第二步:fork 大神的代码[这里以我的代码为例 ...
- 【opencv学习笔记七】访问图像中的像素与图像亮度对比度调整
今天我们来看一下如何访问图像的像素,以及如何改变图像的亮度与对比度. 在之前我们先来看一下图像矩阵数据的排列方式.我们以一个简单的矩阵来说明: 对单通道图像排列如下: 对于双通道图像排列如下: 那么对 ...
随机推荐
- springmvc与fastjson的整合,注解@RequestBody的使用
项目内容用的是jetty框架,传输数据格式是json格式,有一天我心血来潮,把项目又搭建了一次,完了,卡在了数据传输的格式上,明明原来框架直接用fastjson,但是我用就是不对,总是报fastjso ...
- 一个简单的C语言题背后的故事
最近看到了一个C语言问题,是要计算出这个函数的输出: #include <stdio.h> int Test(int x,int y, int z){ printf("x,y,z ...
- javascript 最全面的数组操作合集
一.数组添加.删除.替换.截取操作 1.arr.unshift(1) 在数组头部添加一个元素 1 (直接改变原数组,返回值为添加元素后数组的length) 2.arr.shift() 在数组的头部删除 ...
- Liferay7 BPM门户开发之15: Liferay开发体系简介
Liferay SDK 开发体系 主要分6种: Portlet Hook Theme Layout Templates Web Modules Ext Portlet :类似于servlet的web组 ...
- 利用history.pushState()实现页面无刷新更新
本来是在研究vue-router如何记录滚动位置,点返回的时候还是回到原来的位置,看到有人说的history.state存了一个值,才把history研究一下,发现 history.pushState ...
- yum安装时遇到的问题
在yum 安装出现下面的提示的时候,需要安装GPG key warning: rpmts_HdrFromFdno: Header V3 DSA signature: NOKEY, key ID e85 ...
- 实验吧 貌似有点难 伪造ip
解题链接: http://ctf5.shiyanbar.com/phpaudit/ 解答: 点击View the source code —>代码显示IP为1.1.1.1即可得到KEY—> ...
- Nginx实战-后端应用健康检查
严格来说,nginx是没有针对负载均衡后端节点的健康检查的,但是可以通过proxy_next_upstream来间接实现,但这个还是会把请求转发给故障服务器的,然后再转发给别的服务器,这样就浪费了一次 ...
- Hibernate学习(一)———— 第一个hibernate工程
一.什么是Hibernate? 轻量级JavaEE应用的持久层框架,是一个完全的ORM框架.(说完这句话,肯定有很多人懵圈了,下面我来一个个解释) 持久化:将我们想要保存的数据保存到硬盘上,也就是我们 ...
- PHP 网页数据api采集
一个简单的数据采集,这里用的方法是API数据采集 //api地址,读取文本 $result = file_get_contents("https://feed.mix.sina.com.cn ...