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. Swift5 语言指南(十) 枚举

    一个枚举定义了一个通用型的一组相关的值,使你在你的代码中的一个类型安全的方式这些值来工作. 如果您熟悉C,您将知道C枚举将相关名称分配给一组整数值.Swift中的枚举更灵活,并且不必为枚举的每个案例提 ...

  2. ElasticSearch权威指南学习(结构化查询)

    请求体查询 简单查询语句(lite)是一种有效的命令行adhoc查询.但是,如果你想要善用搜索,你必须使用请求体查询(request body search)API. 空查询 我们以最简单的 sear ...

  3. javaScript 二分查找

    什么是二分查找的,举个栗子: var arr = [1, 3, 5, 7, 9, 11, 14, 15, 17, 19, 20]; 上面有序数组, 随便给你一位 9 ,输出该数在数组中的索引.   当 ...

  4. Shell - Shell脚本调试方法

    Shell脚本调试选项 Shell本身提供一些调试方法选项: -n,读一遍脚本中的命令但不执行,用于检查脚本中的语法错误. -v,一边执行脚本,一边将执行过的脚本命令打印到标准输出. -x,提供跟踪执 ...

  5. LeetCode:105_Construct Binary Tree from Preorder and Inorder Traversal | 根据前序和中序遍历构建二叉树 | Medium

    要求:通过二叉树的前序和中序遍历序列构建一颗二叉树 代码如下: struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode ...

  6. Servlet-session简介及使用场景

  7. SpringBoot之OAuth2.0学习之客户端快速上手

    2.1.@EnableOAuth2Sso 这个注解是为了开启OAuth2.0的sso功能,如果我们配置了WebSecurityConfigurerAdapter,它通过添加身份验证过滤器和身份验证(e ...

  8. MVC5笔记

    创建一个MVC网站后,我们可以在/app_strat/routeConfig.cs中来查看集中控制路的方法,RegisterRoutes方法(注册路由),我们改一下,删除默认的RegisterRout ...

  9. Git学习系列之Windows上安装Git详细步骤(图文详解)

    前言 最初,Git是用于Linux下的内核代码管理.因为其非常好用,目前,已经被成功移植到Mac和Windows操作系统下. 鉴于大部分使用者使用的是Windows操作系统,故,这里详细讲解Windo ...

  10. Java并发编程笔记之 CountDownLatch闭锁的源码分析

    JUC 中倒数计数器 CountDownLatch 的使用与原理分析,当需要等待多个线程执行完毕后在做一件事情时候 CountDownLatch 是比调用线程的 join 方法更好的选择,CountD ...