.Net内置特性Attribute介绍
特性Attribute概述
特性(Attribute)是一种特殊的类型,可以加载到程序集或者程序集的类型上,这些类型包括模块、类、接口、结构、构造函数、方法、字段等,加载了特性的类型称之为特性的目标。这里为与属性(Property)区分,所以称之为特性(Attribute)。特性是为程序集添加元数据的一种机制,通过它可以为编译器提供指示或者对数据进行说明。例如前段时间学习的Remoting技术(主要用于应用程序域之间的对象通信)中在应用程序域间的引用对象时该对象具有序列化(Serializable)这个特性。下面使用ObsoleteAttribute特性学习特性的使用方法。
System.ObsoleteAttribute实例
我们有一个旧的方法SendMsg()方法由于功能和效率上的优化重载了这个方法,需要将原来的方法加上Obsolete特性告诉编译器这个方法已经过时,然后编译器发现程序中有地方使用该特性标记过的方法时,就会给出一个如下所示警告信息:

测试代码如下所示:
using System;
namespace AttributeTest
{
/// <summary>
/// 信息实体类
/// </summary>
public class Message
{
//此处具体实现略
}
/// <summary>
/// 信息操作类
/// </summary>
public class MessageOperation
{
[Obsolete("请使用新的SendMsg(Message msg)重载方法")]
public static void SendMsg()
{
Console.WriteLine("这是旧的SendMsg方法");
}
public static void SendMsg(Message msg)
{
Console.WriteLine("这是新的SendMsg方法");
}
}
class Program
{
static void Main(string[] args)
{
//使用旧的方法SendMsg()
MessageOperation.SendMsg();
//使用新的方法SendMsg(Message msg)
MessageOperation.SendMsg(new Message());
}
}
}
这样一来,开发人员编译运行时就看到了"请使用新的SendMsg(Message msg)重载方法"警告,然后就知道应该选用新的SendMsg(Message msg)重载方法。通过上面的例子可以看到特性使用的方法:首先是一对方括号“[]”,在左方括号中后紧跟特性的名称,比如Obsolete。随后是一个圆括号“()”,在这个圆括号中,不光可以传入构造函数的参数,还可以向特性的属性赋值。在Obsolete的例子中,仅传递了构造函数的参数。构造参数又称为位置参数(传入顺序必须与构造函数声明时一致);属性参数也叫做命名参数。
下面通过自定义特性进一步学习特性。
自定义特性
假设我们有这么一个需求:创建或者更新一个类文件是需要说明这个类是什么时候谁创建的,以后是谁更新的等,是不是想下面这样在类上添加注释:

这样手动添加是可以记录下来但是需要查看所有类型的更新记录显然就不适合了。带着这么一个悬念,我们先看看Obsolete特性的具体定义如下所示:
using System.Runtime.InteropServices;
namespace System
{
// 摘要:
// 标记不再使用的程序元素。无法继承此类。
[Serializable]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Constructor | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Interface | AttributeTargets.Delegate, Inherited = false)]
[ComVisible(true)]
public sealed class ObsoleteAttribute : Attribute
{
// 摘要:
// 使用默认属性初始化 System.ObsoleteAttribute 类的新实例。
public ObsoleteAttribute();
//
// 摘要:
// 使用指定的变通方法消息初始化 System.ObsoleteAttribute 类的新实例。
//
// 参数:
// message:
// 描述可选的变通方法的文本字符串。
public ObsoleteAttribute(string message);
//
// 摘要:
// 使用变通方法消息和布尔值初始化 System.ObsoleteAttribute 类的新实例,该布尔值指示是否将使用已过时的元素视为错误。
//
// 参数:
// message:
// 描述可选的变通方法的文本字符串。
//
// error:
// 指示是否将使用已过时的元素视为错误的布尔值。
public ObsoleteAttribute(string message, bool error);
// 摘要:
// 获取指示编译器是否将使用已过时的程序元素视为错误的布尔值。
//
// 返回结果:
// 如果将使用已过时的元素视为错误,则为 true;否则为 false。默认为 false。
public bool IsError { get; }
//
// 摘要:
// 获取变通方法消息,包括对可选程序元素的说明。
//
// 返回结果:
// 变通方法文本字符串。
public string Message { get; }
}
}
我们看到Obsolete特性在定义时继承了Attribute(这是特性必需的),使用了Serializable、ComVisible和AttributeUsage这三个属性。Serializable属性表明类型支持序列化;ComVisible为 true,指示该托管类型(public 类型)对 COM 是可见的;AttributeUsage定义您自己的特性类时,可通过在特性类上放置 AttributeUsageAttribute 来控制特性类的使用方式。
通过上述的学习并根据前面的需求,我们自定义一个特性RecordAttribute,实现代码如下所示:
//该特性可用于方法和类并且可以重复的特价到一个类型上
[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method,AllowMultiple = true)]
public class RecordAttribute : Attribute
{
private string _recordType;//记录类型:更新or创建
private string _author;//作者
private string _date;//日期
private string _comment;//备注
//构造函数
public RecordAttribute(string recordType, string author, string date)
{
_recordType = recordType;
_author = author;
_date = date;
}
//对于位置参数,通常只提供get访问器
public string RecordType { get { return _recordType; }}
public string Author { get { return _author; } }
public string Date { get { return _date; } }
//构建一个属性,在特性中也叫做命名参数
public string Comment { get; set; }
}
记录类修改或者更新的特性创建好了,下面是使用示例:
[Record("更新", "鞠小军", "2014.8.3", Comment = "添加ToString()方法")]
[Record("更新", "鞠小军", "2014.8.3")]
[Record("创建","鞠小军","2014.8.2")]
public class Message
{
//此处具体实现略
public override string ToString()
{
return "添加了ToString()方法";
}
}
这样就成功实现了上面的需求,Message类添加的Record属性实际上作为元数据添加到了程序集中。
.Net内置特性Attribute介绍的更多相关文章
- python内置函数详细介绍
知识内容: 1.python内置函数简介 2.python内置函数详细介绍 一.python内置函数简介 python中有很多内置函数,实现了一些基本功能,内置函数的官方介绍文档: https: ...
- linux awk 内置函数详细介绍(实例)
这节详细介绍awk内置函数,主要分以下3种类似:算数函数.字符串函数.其它一般函数.时间函数 一.算术函数: 以下算术函数执行与 C 语言中名称相同的子例程相同的操作: 函数名 说明 atan2( y ...
- Python中内置函数的介绍
内置函数的功能介绍 常用内置函数如下: 1.abs() 绝对值 格式:abs(x) 例如:print(abs(-18)) >>> 18 返回值:number #该函数主要用于数值类的 ...
- 类的内置方法__attr__介绍
1.hasattr getaddr setaddr delattr 这四个函数同样也适用于类 class BlackMedium: feture="Ugly" def __in ...
- mysql 内置功能 存储过程介绍
存储过程介绍 就是mysql内置功能把逻辑写好 的功能给封装好,封装成一个接口名,把接口名丢给应用程序,应用程序直接调用接口名实现一系列增删改查功能 这个接口叫存储过程 基于存储过程封装成一个功能 存 ...
- linux awk 内置函数详细介绍(实例)
这节详细介绍awk内置函数,主要分以下3种类似:算数函数.字符串函数.其它一般函数.时间函数 一.算术函数: 以下算术函数执行与 C 语言中名称相同的子例程相同的操作: 函数名 说明 atan2( y ...
- Linux基础教程 linux awk内置变量使用介绍
awk是个优秀文本处理工具,可以说是一门程序设计语言.下面是兄弟连Linux培训 给大家介绍的awk内置变量. 一.内置变量表 属性 说明 $0 当前记录(作为单个变量) $1~$n 当前记录的第n个 ...
- JSP第二篇【内置对象的介绍、4种属性范围、应用场景】
什么是JSP内置对象 JSP引擎在调用JSP对应的jspServlet时,会传递或创建9个与web开发相关的对象供jspServlet使用.JSP技术的设计者为便于开发人员在编写JSP页面时获得这些w ...
- Orchard内置特性(以模块来说的)
本文链接:http://www.cnblogs.com/souther/p/4539169.html 主目录 Orchard中有很多可以直接和多次使用的特性,这些东西在官方的Gallery中可以找到. ...
随机推荐
- UVALive 3971 组装电脑
https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...
- centos7 docker activemq
/ cd /home/activemq// wget http://apache.fayea.com/activemq/5.13.3/apache-activemq-5.13.3-bin.tar.gz ...
- c# 正则提取小例子
常用分组语法 分类 代码/语法 说明 捕获 (exp) 匹配exp,并捕获文本到自动命名的组里 (?<name>exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'na ...
- window.onload和window.onscroll
之前我的一个页面里写了引入了2个js,一个是包含置顶的侧面客服,一个是定位导航.2个开始都用了window.onload,发现第一个js的定位导航没有显示,被第2个js覆盖了,当我去掉第2个js的wi ...
- JavaScript中的方法重载
对js有些了解的人都知道,在js中根本就不存在像C#中的那种方法重载,而有的只是方法的覆盖,当你在js中敲入两个或多个同名的方法的时候,不管方法(函数)的参数个数怎么个不同,这个方法名只能属于最后定义 ...
- TCP/IP协议学习(七) 基于C# Socket的Web服务器---动态通讯实现
目录 (1).基于Ajax的前端实现 (2).Web服务器后端处理 一个完整的web服务器,不仅需要满足用户端对于图片.文档等资源的需求:还能够对于用户端的动态请求,返回指定程序生成的数据.支持动态请 ...
- sql server项目死活启动不了的问题
报错没截图, 关键字"sessionfactory",tomacat 能够启动,但是网页打开是错误的 解决:c盘索引文件冲突,删除了 发生数据库c3p0错误,tomcat启动没玩没 ...
- Linux基础知识
1.url中不写端口号,默认就是80端口:本机是127.0.0.1或者localhost 2.用户管理 查看当前用户: id:可以查看当前用户:whoami:查看当前的用户:who:可以查看当前已经登 ...
- 编写我的第一个CGI代码——python学习
在编程学习网站学习Python语言,学习到cgi编程章节遇到了一些小问题,课程介绍的为linux环境的Apache配置方法,具体如下: [linux环境配置方法:] 在进行CGI编程前,确保您的Web ...
- iOS中的数据持久化方式
iOS中的数据持久化方式,基本上有以下四种:属性列表.对象归档.SQLite3和Core Data. 1.属性列表 涉及到的主要类:NSUserDefaults,一般 [NSUserDefaults ...