在项目中接触到了Attribute,那么什么是Attribute,有些什么作用呢?这里来了解一下。
一、什么是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,当中应该注意的它们使用时,各自的參数的意义。下篇博客总结有关自己定义特性的一些知识和应用