.Net Attribute详解(上)-Attribute本质以及一个简单示例
Attribute的直接翻译是属性,这和Property容易产生混淆,所以一般翻译成特性加以区分。Attribute常常的表现形式就是[AttributeName], 随意地添加在class, method的头上,然后就能够产生各种各样奇特的效果和行为。比如关于序列化的标签[Serializable]用来指定一个实体类可以序列化。[NonSerialized]可以用来指定某些属性不包含在序列化中。
一, Attribute本质是什么?
Attribute类似于标签, 可以为类,方法,结构体,属性,委托等贴上标签,在以后的实际执行时候,根据不同的标签做不同的处理。拿类做个比方,如果把一个类看做一个人的话,它有自己的名字Person, 有自己的属性Hand, Foot等,有自己的功能Walk(), Sleep()等,那么加在类上的Attribute就好像是给类这个人穿上的一件外衣。如果我们看到他穿的不同制服,就知道这个人是什么职业,是一个警察,空姐还是快递。
拿上面的所举例的序列化标签[NonSerialized]来说,他就给属性穿上一件外衣,外衣上写着“不要序列化我”,这样在执行具体的序列化的过程中,当序列化操作发现了披着这个外衣对的属性,就会跳过。
二, Attribute的具象
对于Attribute的具体的代码呈现,它有这些特点:
1. Attribute是一个类
自定义的Attribute是一个类,而且必须继承自System.Attribute.
2. Attribute的名字
Attribute类名一般以Attribute结尾, 但是在具体使用时候,可以省去Attribute。加入定义了一个HelperAttribute, 具体使用的时候,可以这样写[Helper].
3. Attribute的使用范围
Attribute类在定义的时候,可以指定这个Attribute的应用范围,AttributeTargets枚举就列出了可以指定的范围,可以是class, field……
[AttributeUsage(AttributeTargets.All)]
public class AcronymAttribute : Attribute
{
}
三, 一个自定义Attribute例子
1. 自定义BlockAttribute
假设有个过滤不当言论的需求,我们可以通过自定义的BlockAttribute为不同类型的人套上外衣,凡是贴上BlockAttribute的人,我们就不允许他发言。
BlockAttribute的代码定义如下:
[AttributeUsage(AttributeTargets.Class)]//指定Attribute的使用范围,只能在class级别使用
public class BlockAttribute : Attribute
{
public Level Level
{
get;
set;
} public BlockAttribute(Level level)//在实例化的时候,就指定Block是Yes还是No
{
Level = level;
}
} public enum Level
{
NO,
Yes
}
2. 使用Attribute
接着我们把它使用在我们的GovermentSay类上,它的级别自然是Yes
[Block(Level.Yes)]
public class GovermentSay : ISay
{
public string Say()
{
return "Our country is the most democratic country";
}
}
把BlockAttribute用在PeopleSay类上,级别是No
[Block(Level.NO)]
public class PeopleSay : ISay
{
public string Say()
{
return "We need rights";
}
}
3. Attribute的过滤
接着是我们ThePress类,它的主要作用,就是根据BlockAttribute不同,区别对待。因为它们被BlockAttribute贴上了不同的标签,所以非常容易区分它们。
public class ThePress
{
public static void Print(ISay say)
{
System.Reflection.MemberInfo info = say.GetType();
BlockAttribute att=
(BlockAttribute)Attribute.GetCustomAttribute(info, typeof(BlockAttribute));
if (att.Level == Level.Yes)//如果标签是Yes
Console.WriteLine(say.GetType().ToString() + ": " + say.Say());
else//如果是No
Console.WriteLine(say.GetType().ToString() + ": " + "I Love the country!");
}
}
上面就是一个完整的Attribute使用的例子。
四,总结
Attribute使用,一共分三个步骤,Attribute的定义, Attribute的使用(贴标签), Attribute的读取和使用(根据标签做不同处理)
最后,附上本文相关源代码。 AttributeDemo.zip
.Net Attribute详解(上)-Attribute本质以及一个简单示例的更多相关文章
- Tomcat详解系列(1) - 如何设计一个简单的web容器
Tomcat - 如何设计一个简单的web容器 在学习Tomcat前,很多人先入为主的对它的认知是巨复杂的:所以第一步,在学习它之前,要打破这种观念,我们通过学习如何设计一个最基本的web容器来看它需 ...
- 大数据入门第七天——MapReduce详解(一)入门与简单示例
一.概述 1.map-reduce是什么 Hadoop MapReduce is a software framework for easily writing applications which ...
- 【转】详解Data Binding 通过几个简单示例深入了解WinForm数据绑定特性
原文地址:http://www.cnblogs.com/lichence/archive/2012/02/17/2356001.html
- .Net Attribute详解(下) - 使用Attribute武装枚举类型
接上文.Net Attribute详解(上)-Attribute本质以及一个简单示例,这篇文章介绍一个非常实用的例子,相信你一定能够用到你正在开发的项目中.枚举类型被常常用到项目中,如果要使用枚举To ...
- .Net Attribute详解(一)
.Net Attribute详解(一) 2013-11-27 08:10 by JustRun, 1427 阅读, 14 评论, 收藏, 编辑 Attribute的直接翻译是属性,这和Property ...
- C#中的Attribute详解(下)
原文地址:https://blog.csdn.net/xiaouncle/article/details/70229119 C#中的Attribute详解(下) 一.Attribute本质 从上篇里我 ...
- IE8“开发人员工具”使用详解上(各级菜单详解)
来源: http://www.cnblogs.com/JustinYoung/archive/2009/03/24/kaifarenyuangongju.html IE8“开发人员工具”使用详解上(各 ...
- C++框架_之Qt的窗口部件系统的详解-上
C++框架_之Qt的窗口部件系统的详解-上 第一部分概述 第一次建立helloworld程序时,曾看到Qt Creator提供的默认基类只有QMainWindow.QWidget和QDialog三种. ...
- [js高手之路]深入浅出webpack教程系列2-配置文件webpack.config.js详解(上)
[js高手之路]深入浅出webpack教程系列索引目录: [js高手之路]深入浅出webpack教程系列1-安装与基本打包用法和命令参数 [js高手之路]深入浅出webpack教程系列2-配置文件we ...
随机推荐
- Oracle Database 11g For Windows7 旗舰版的安装
系统环境:win7 32位系统 安装步骤: 1,Oracle(甲骨文)官网下载适合自己的数据库安装包,下载地址http://www.oracle.com/technetwork/cn/indexes/ ...
- python统计列表内元素个数
代码如下: list01 = ['a','b','c','a','c'] set01 = set(list01) print(set01) dict01 = {} for item in set01: ...
- CI框架源码阅读笔记2 一切的入口 index.php
上一节(CI框架源码阅读笔记1 - 环境准备.基本术语和框架流程)中,我们提到了CI框架的基本流程,这里再次贴出流程图,以备参考: 作为CI框架的入口文件,源码阅读,自然由此开始.在源码阅读的过程中, ...
- php高级
php面试题之一--PHP核心技术(高级部分) 一.PHP核心技术 1.写出一个能创建多级目录的PHP函数(新浪网技术部) <?php /** * 创建多级目录 * @param $path s ...
- python日志模块---logging
1.将日志打印到屏幕 import logging logging.debug('This is debug message---by liu-ke') logging.info('This is i ...
- testng对失败时截图处理
1.截图类: public class ScreenShot { public WebDriver driver; public ScreenShot(WebDriver driver) { this ...
- Sharepoint2013:日期控件报错
1 问题 1> 在sharepoint中的,日期控件(DateTimeControl),日期过滤控件(Date Filter)和SPListViewFilter等包含日期组件的控件,在特定情况下 ...
- [deviceone开发]-毛玻璃效果示例
一.简介 do_Bitmap组件可以把图片加载为内存里的Bitmap对象,能够对这个对象做各种图形化处理.目前只有3种处理,圆角,毛玻璃,灰度.以后会添加更多. 二.效果图 三.相关下载 https: ...
- [deviceone开发]-拼图小游戏
一.简介 九宫格小游戏,可从本地图库载入一张图片,填充到9个ImageView,另涉及Timer计时.图库控件. 每个格子都是相同的控件,动态添加到首页中的,在初始化后,响应touch事件,之后通过多 ...
- Electron笔记
一个能让你用Web技术开发桌面应用的开源项目.这里做一个笔记(非正式文章): 官网地址:http://electron.atom.io/ API相关 Electron提供的主进程接口.渲染进程接口.共 ...