转载自:http://blog.csdn.net/wangyy130/article/details/44241173

一、什么是Attribute

Attribute 类将预定义的系统信息或用户定义的自定义信息与目标元素相关联。目标元素可以是程序集、类、构造函数、委托、枚举、事件、字段、接口、方法、可移植可执行文件模块、参数、属性 (Property)、返回值、结构或其他属性 (Attribute)

在这里,我们需要将Attribute和property分开

property是指类想外提供的字段,它属于面向对象层面中抽象类时,该类的一种状态描述,比如我们根据美国人的特点高鼻梁,黄头发,蓝眼睛等这些特征,来抽象出一个Americans这个类,那么这里的高鼻梁,黄头发,蓝眼睛就是American这个类的property

Attribute是在程序编译或运行时,来描述类或其它事物的某种特点的。

比如,我们在程序中声明了两个不同的方法,但是一个是原来声明的,已经过时了,那么我们就可以利用Attribute来进行标识,让它来告诉程序,这个不能使用。它属于编程语言文法上的东西。好像一种协议或规定之类的,它并不一定是某个对象所具有的属性。

二、使用

通过上面的介绍,应该对Attribute有了一个大致的概念了,我们看一下具体的应用。

它可分为两类:1、预定义:微软已经封装好的

2、自定义:需要自己定义然后使用的。为用户提供了很好的扩展

先来说一下预定义有哪些Attribute

1、Conditional

当调用标记为条件的方法时,指定的预处理符号的存在或不存在决定是否包含或省略此调用。如果定义了该符号,则包含调用;否则省略调用。使用 Conditional 是封闭#if 和 #endif 内部方法的替代方法,它更整洁、更别致、减少了出错的机会

实例:

#define yanyan //宏定义,必须在所有代码之前 
using System.Diagnostics;
class Program
{
static void Main(string[] args)
{
A.B();
A.C();
}
}
public class A { [Conditional("yanyan")]
public static void B() {
Console.WriteLine("Hello");
}
[Conditional("lixue")]
public static void C() {
Console.WriteLine("World");
} }

  

这里需要注意的是:如果没有定义任何条件的方法,那么默认只要调用就总是会执行此方法,如果你想通过条件来判断执行,那么该方法上必须至少包含一个conditional特性所定义的条件,它才会响应你定义的条件#define

定义多个条件:

逻辑或

[Conditional("yanyan"),Conditional("wyy")]

public static void B() {

Console.WriteLine("Hello");

}

逻辑与:MSDN提供了方法,但是未能实现,对其含义没能完全理解

2、Obsolete

ObsoleteAttribute适用于所有程序元素除了组件、模块、参数和返回值。将一个元素标记为过时的告知用户,该元素在该产品的未来版本将被删除。

实例:

 using System;
using System.Reflection;
public class Example
{
// Mark OldProperty As Obsolete.
[ObsoleteAttribute("This property is obsolete. Use NewProperty instead.", false)]
public static string OldProperty
{ get { return "The old property value."; } }
public static string NewProperty
{ get { return "The new property value."; } }
// Mark CallOldMethod As Obsolete.
[ObsoleteAttribute("This method is obsolete. Call CallNewMethod instead.", true)]
public static string CallOldMethod()
{
return "You have called CallOldMethod.";
}
public static string CallNewMethod()
{
return "You have called CallNewMethod.";
}
public static void Main()
{
Console.WriteLine(OldProperty);
Console.WriteLine();
Console.WriteLine(CallOldMethod());
}
}

  

注意:在这里,如果给obsolete第二个参数赋值,false代表编译时,如果调用了此方法,会提出警告,但不会把它当做错误,否则true为当成错误,不能编译成功

3、AttributeUsage

确定可以如何使用自定义特性类。 AttributeUsage 是一个可应用于自定义特性定义,以便控制如何应用新特性的特性。

此特性主要有三个参数:1、AttributeTargets:作用目标,即对这个特性生效的具体对象,可能是一个类或方法等也可以为All

2、AllowMultiple:是否允许多个实体多次使用

3、Inherited :是否允许派生于特性化的类对它进行继承

这个类既然是针对于自定义类的,那具体的应用就应该从自定义特性中去理解。

总结:以上是关于预定义特性的一些基础,主要包括三个类,Conditional,Obsolete和AttributeUsage,其中应该注意的它们使用时,各自的参数的意义,下篇博客总结有关自定义特性的一些知识和应用

最新文章

  1. .NET工程师面试宝典
  2. 面试题:“你能不能谈谈,java GC是在什么时候,对什么东西,做了什么事情?”
  3. Oracle中"行转列"的实现方式
  4. windows系统调用 临界区机制
  5. 【译】Python Lex Yacc手册
  6. Redis 笔记与总结8 PHP + Redis 信息管理系统(分页+好友关注)
  7. WebLogic11g-半小时让你的domain集群化
  8. 开发工具及服务年度大奖评选 I Bugtags 荣获最具成长潜力奖
  9. Botposter.com集群ETCD2.3.7升级至3.0实录[原创]
  10. 内存泄露了么: Handlers & Inner Classes
  11. 可发布指定的ASP.NET页面的插件:LimusicAddin
  12. SQL2005以上行变行简单实现
  13. ExtJS4 便捷三层开发模式
  14. 201521123083 《Java程序设计》第7周学习总结
  15. MVVM前后分离轻量级框架应用juicer和doT.js
  16. Windows下Nginx的启动、停止等基本命令
  17. Sublime Text3下使用Python,REPL的安装与快捷键设置方法
  18. mean项目的分模块开发
  19. Linux内核入门到放弃-进程管理和调度-《深入Linux内核架构》笔记
  20. springboot+jpa+mysql+swagger整合

热门文章

  1. nodejs 服务器模拟异常状态码429,以及前端vue axios捕获状态码
  2. ArcGIS超级工具SPTOOLS-按属性裁剪,矢量数据批量裁剪,矢量数据批量合库
  3. Hadoop常用操作汇总
  4. 004-jdk-数据结构-ArrayList、LinkedList
  5. C++ STL nth_element
  6. 启动Spring boot报错:nested exception is java.sql.SQLException: Field 'id' doesn't have a default value
  7. mybatis plus foreach 的用法
  8. 图解 HTTP 笔记(二)——简单的 HTTP 协议
  9. CockroachDB学习笔记——[译]Hello World
  10. WebsSocket