1 神马是特性?如何自定义一个特性?

(1)特性是什么

    特性是一个对象,可以加载到程序集及程序集的对象中,这些对象包括 程序集本身、模块、类、接口、结构、构造函数、方法、方法参数等,加载了特性的对象称作特性的目标。特性是为程序添加元数据(描述数据的数据)的一种机制,通过它可以给编译器提供指示或者提供对数据的说明。

Attributes和Microsoft .NET Framework文件的元数据保存在一起。

总结为:定制特性attribute,本质上是一个类,为目标元素提供关联附加信息并在运行期以反射的方式来获取。

几个习惯用法:
    自定义特性必须直接或间接继承自System.Attribute类而且该类必须要有公有的构造函数;
    自定义特性应该有一个Attribute后缀,习惯约定(在调用中可以省略,会自动匹配);
    非抽象特性必须要有public访问权限;
    定制特性不会影响应用元素的任何功能,只是约定了该元素具有的特质;

1.1 System.ObsoleteAttribute 特性

给旧SendMsg()方法加上Obsolete特性来告诉编译器这个方法已经过时,当编译器发现当程序中有地方在使用这个用Obsolete标记过的方法时,就会给出一个警告信息。

1.2 特性的使用方法

首先是有一对方括号“[]”,在左方括号“[”后紧跟特性的名称,比如Obsolete,随后是一个圆括号“()”。和普通的类不同,这个圆括号不光可以写入构造函数的参数,还可以给类的属性赋值。

 

(2)如何自定义特性

定义一个特性的本质就是定义一个继承自System.Attribute类的类型.

[AttributeUsage(AttributeTargets.Class, AllowMutiple=true, Inherited=false)]
public class RecordAttribute :Attribute {
private string recordType; // 记录类型:更新/创建
private string author; // 作者
private DateTime date; // 更新/创建 日期
private string memo; // 备注 // 构造函数,构造函数的参数在特性中也称为“位置参数”。
public RecordAttribute(string recordType, string author, string date) {
this.recordType = recordType;
this.author = author;
this.date = Convert.ToDateTime(date);
} // 对于位置参数,通常只提供get访问器
public string RecordType { get { return recordType; } }
public string Author { get { return author; } }
public DateTime Date { get { return date; } } // 构建一个属性,在特性中也叫“命名参数”
public string Memo {
get { return memo; }
set { memo = value; }
}
} [Record("更新", "Matthew", "2008-1-20", Memo = "修改 ToString()方法")]
[Record("更新", "Jimmy", "2008-1-18")]
[Record("创建", "张子阳", "2008-1-15")]
public class DemoClass {
public override string ToString() {
return "This is a demo class";
}
} class Program {
static void Main(string[] args) {
Type t = typeof(DemoClass);
Console.WriteLine("下面列出应用于 {0} 的RecordAttribute属性:" , t); // 获取所有的RecordAttributes特性
object[] records = t.GetCustomAttributes(typeof(RecordAttribute), false); foreach (RecordAttribute record in records) {
Console.WriteLine(" {0}", record);
Console.WriteLine(" 类型:{0}", record.RecordType);
Console.WriteLine(" 作者:{0}", record.Author);
Console.WriteLine(" 日期:{0}", record.Date.ToShortDateString());
if(!String.IsNullOrEmpty(record.Memo)){
Console.WriteLine(" 备注:{0}",record.Memo);
}
}
}
} 下面列出应用于 AttributeDemo.DemoClass 的RecordAttribute属性:
AttributeDemo.RecordAttribute
类型:更新
作者:Matthew
日期:2008-1-20
备注:修改 ToString()方法
AttributeDemo.RecordAttribute
类型:更新
作者:Jimmy
日期:2008-1-18
AttributeDemo.RecordAttribute
类型:创建
作者:张子阳
日期:2008-1-15

  参照obsolete特性,我们应该发现,它继承自Attribute类,这说明我们的RecordAttribute也应该继承自Attribute类。

其次,我们发现在这个特性的定义上,又用了三个特性去描述它,只需要掌握 AttributeUsage就可以了。

AttributeTargets 是一个位标记(枚举),它定义了特性可以应用的类型和对象。可以使用按位或“|”来进行组合

AllowMutiple 属性用于设置该特性是不是可以重复地添加到一个类型上(默认为false)。

假如有一个类继承自我们的DemoClass,那么将RecordAttribute添加到DemoClass上时,其子类也会获得该特性。而当特性应用于一个方法,如果继承自该类的子类将这个方法覆盖,那么Inherited则用于说明是否子类方法是否继承这个特性。

  实际项目的例子

namespace SC.Component.Utility
{
using System; [AttributeUsage(AttributeTargets.Method, AllowMultiple=false, Inherited=false)]
public sealed class APIMethodAttribute : Attribute
{
private string m_APIUrl; public APIMethodAttribute()
{
} public APIMethodAttribute(string apiUrl)
{
this.m_APIUrl = apiUrl;
} public string APIUrl
{
get
{
return this.m_APIUrl;
}
set
{
this.m_APIUrl = value;
}
}
}
}
        [APIMethod("TravelOrderList")]
public static string GetTravelList(JourneyCalendarParmas reqParams)
{
string result = string.Empty;
try
{
........
}
catch (Exception ex)
{
return null;
} return result;
}

  

.NET基础拾遗(6)特性的更多相关文章

  1. .NET基础拾遗(4)委托、事件、反射与特性

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...

  2. 基础拾遗------redis详解

    基础拾遗 基础拾遗------特性详解 基础拾遗------webservice详解 基础拾遗------redis详解 基础拾遗------反射详解 基础拾遗------委托详解 基础拾遗----- ...

  3. 基础拾遗------webservice详解

    基础拾遗 基础拾遗------特性详解 基础拾遗------webservice详解 基础拾遗------redis详解 基础拾遗------反射详解 基础拾遗------委托详解 基础拾遗----- ...

  4. 基础拾遗-----mongoDB操作

    基础拾遗 基础拾遗------特性详解 基础拾遗------webservice详解 基础拾遗------redis详解 基础拾遗------反射详解 基础拾遗------委托详解 基础拾遗----- ...

  5. 基础拾遗----RabbitMQ(含封装类库源码)

    基础拾遗 基础拾遗------特性详解 基础拾遗------webservice详解 基础拾遗------redis详解 基础拾遗------反射详解 基础拾遗------委托详解 基础拾遗----- ...

  6. 基础拾遗----RabbitMQ

    基础拾遗 基础拾遗------特性详解 基础拾遗------webservice详解 基础拾遗------redis详解 基础拾遗------反射详解 基础拾遗------委托详解 基础拾遗----- ...

  7. Java基础拾遗(二)

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76358523冷血之心的博客) 马上就要秋招了,新的一轮笔试面试马上 ...

  8. C#基础拾遗系列之二:使用ILSpy探索C#7.0新增功能点

    C#基础拾遗系列之二:使用ILSpy探索C#7.0新增功能点   第一部分: C#是一种通用的,类型安全的,面向对象的编程语言.有如下特点: (1)面向对象:c# 是面向对象的范例的一个丰富实现, 它 ...

  9. linux基础之bash特性

    linux基础之bash特性 1.命令历史 命令历史包含的环境变量 $HISTSIZE:命令历史记录的条数 $HISTFILE:命令历史文件~/.bash_history $HISTFILESIZE: ...

  10. Java基础-面向对象第一特性之封装(Encapsulation)

    Java基础-面向对象第一特性之封装(Encapsulation) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.理解什么是面向过程和面向对象 面向过程与面向对象都是我们编程中 ...

随机推荐

  1. Java 坦克小游戏心得

    原本是闲得慌无聊才去尝试做这个项目的,因为小时候玩小霸王的游戏机,那个时候经常玩这个游戏吧,特别是喜欢那种自定义地图的模式,觉得自由度非常不错.总之关于这个游戏,想说的一大堆.鉴于能有个空闲的时间,打 ...

  2. Objective-C基础之──多态

    Objective-C语言是面向对象的高级编程语言,因此,它具有面向对象编程所具有的一些特性,即:封装性.继承性和多态性. 今天介绍一下Objective-C中的多态性. 一.什么是多态 多态:不同对 ...

  3. Bootstrap3 入门实战

    因为公司选择了使用BootStrap3作为项目的前台展示框架,所以花了半天时间来学习Bootstrap, 如果你是第一次听说,或者说以前听说过,但没有使用过这个框架的话,希望这篇入门实战能够让你快速掌 ...

  4. python生成html文件浏览器中文显示乱码问题

    近来在网上采集数据,想把采集下来的数据整合成html的形式保存.以便其他的平台产品可以直接读取html显示或者根据html标签提取数据. def output_html(self): try: fou ...

  5. Scala学习笔记--Actor和并发

    感谢博主lyrebing  博文地址:http://blog.csdn.net/lyrebing/article/details/20446061 1.  Actor用法 1.1 Actor的基本使用 ...

  6. OCR中的倾斜矫正

    电面中被问到了做的LPR,简单的介绍了下后又问到了关于如何矫正倾斜角的问题.答得比较含糊,所以今天来补充一下. 倾斜矫正的方法有很多种,包括基于Hough变换的矫正,基于字符投影的倾角矫正,常规线性角 ...

  7. 新鲜出炉的awk代码

    echo "" | igawk -f main.awk # 需求:按照多种充值方式的多种金额类型进行累加统计 # 充值方式:移动卡 ,,,100元,联通卡20,,, 电信卡 ,,, ...

  8. QT creator中使用opencv

    最近要用到opencv做图像方面的东西,网上很多是用VS加opencv,但自己对VS不怎么喜欢,想用QT Creator.在网上搜索了很多资料,终于花了一天的时间,在QT Creator上能使用ope ...

  9. JQuery的插件

    最近需要修改ftl文件,使用一般的freemarker插件不能有效处理里边的部分JQuery内容,所以特地下载了一个Spket插件, 地址为 http://www.agpad.com/update 再 ...

  10. hdu Examining the Rooms

    这道题的知识点第一次听说 ,就是应用斯特林数.题目的意思是给你房间数N,和最多能破门的个数,让你求能全部把房间打开的概率! a[i][j]=a[i-1][j-1]+(i-1)*a[i-1][j]; # ...