.Net Attribute详解(一)
.Net Attribute详解(一)
2013-11-27 08:10 by JustRun, 1427 阅读, 14 评论, 收藏, 编辑
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 contry!");
}
}

上面就是一个完整的Attribute使用的例子。
四,总结
Attribute使用,一共分三个步骤,Attribute的定义, Attribute的使用(贴标签), Attribute的读取和使用(根据标签做不同处理)
最后,附上本文相关源代码。 AttributeDemo.zip
如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】按钮。
如果,您希望更容易地发现我的新博客,不妨点击一下右下角的【关注 Justrun】。
因为,我的写作热情也离不开您的肯定支持。
感谢您的阅读,这里还有你可能感兴趣的文章推荐博客文章。
本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名justrun(包含链接)。如您有任何疑问或者授权方面的协商,请给我留言。
.Net Attribute详解(一)的更多相关文章
- .Net Attribute详解(下) - 使用Attribute武装枚举类型
接上文.Net Attribute详解(上)-Attribute本质以及一个简单示例,这篇文章介绍一个非常实用的例子,相信你一定能够用到你正在开发的项目中.枚举类型被常常用到项目中,如果要使用枚举To ...
- C#中的Attribute详解(下)
原文地址:https://blog.csdn.net/xiaouncle/article/details/70229119 C#中的Attribute详解(下) 一.Attribute本质 从上篇里我 ...
- .Net Attribute详解(上)-Attribute本质以及一个简单示例
Attribute的直接翻译是属性,这和Property容易产生混淆,所以一般翻译成特性加以区分.Attribute常常的表现形式就是[AttributeName], 随意地添加在class, met ...
- DOM中 property 和 attribute 详解
被问到 property 和 attribute 的区别,想来也是要好好看一下. 一.基本概念区别 其实Attribute和Property这两个单词,翻译出来都是“属性”,<js高级程序设计& ...
- 学习笔记: 特性Attribute详解,应用封装
/// /// 特性:中括号声明 /// /// 错觉:每一个特性都可以带来对应的功能 /// /// 实际上特性添加后,编译会在元素内部产生IL,但是我们是没办法直接使用的, /// 而且在meta ...
- js中的attribute详解
Attribute是属性的意思,文章仅对部分兼容IE和FF的Attribute相关的介绍.attributes:获取一个属性作为对象getAttribute:获取某一个属性的值object.getAt ...
- C# 自定义特性(Attribute)详解
什么是特性 特性的定义:公共语言运行时允许添加类似关键字的描述声明,叫做attribute,它对程序中的元素进行标注,如类型.字段.方法.和属性等.attribute和.NetFramework文件的 ...
- NUnit的Attribute使用详解
NUNIT使用详解(一) 2008/08/26 11:40 NUnit是一个单元测试框架,专门针对于.NET来写的,它是是xUnit的一员.NUnit完全由C#语言来编写,并且编写时充分利用了许多.N ...
- linux查看端口及端口详解
今天现场查看了TCP端口的占用情况,如下图 红色部分是IP,现场那边问我是不是我的程序占用了tcp的链接,,我远程登陆现场查看了一下,这种类型的tcp链接占用了400多个,,后边查了一下资料,说E ...
随机推荐
- WinForm LED循环显示信息,使用定时器Threading.Timer
原文:WinForm LED循环显示信息,使用定时器Threading.Timer 这里用一个示例来演示timer如何使用.示例:LED屏幕显示描述:这个示例其实很简单,LED屏幕上显示3个信息: ...
- oracle rac常用的命令
oracle rac常用的命令 节点层:olsnodes 网络层: oifcfg 集群层:crsctl,ocrcheck,ocrdump,ocrconfig 应用层:srvctl,onsctl,crs ...
- hibernate中使用sql语句进行表链接查询,对结果集的遍历方法
今天做了一个在hibernate中使用sql语句进行表链接查询的功能,得到的属性是来自两个表中的字段.下面对结果集遍历的方法进行记录. sql语句不写了.部分代码如下: List<Course_ ...
- javascript 实现一个网页,然后计算出有多少剩余时间的倒计时程序
function counter() { var date = new Date(); var year = date.getFullYear(); var date2 = new Date(year ...
- HDU2586
最近的共同祖先反复问的问题. #include <iostream> #include <algorithm> #include <vector> #include ...
- Drop dual
一些互联网用户删除dual表还有一个问题: 删除dual时间表hang直播,然后直接shutdown abort.话又说回来,当您启动数据库.发现open时间已经hang直播.但该数据库是真正开放的另 ...
- JavaScript 奇技淫巧
JavaScript 奇技淫巧 这里记录一下以前学习各种书籍和文章里边出现的JS的小技巧,分享给大家,也供自己查阅,同时感谢那些发现创造和分享这些技巧的前辈和大牛们. 1.遍历一个obj的属性到数组 ...
- [CLR via C#]4. 类型基础及类型、对象、栈和堆运行时的相互联系
原文:[CLR via C#]4. 类型基础及类型.对象.栈和堆运行时的相互联系 CLR要求所有类型最终都要从System.Object派生.也就是所,下面的两个定义是完全相同的, //隐式派生自Sy ...
- linux c socket programming
原文:linux c socket programming http://54min.com/post/http-client-examples-using-c.html 好文章 PPT http:/ ...
- 使用AndroidStudio快速开发教程
关于AndroidStudio的使用 参考:http://www.codes51.com/article/detail_98914.html 1.对于开发环境的通性:编写 调试 视图 一般的开发 ...