attribute在.net编程中的应用

上传人:正** 文档编号:41397310 上传时间:2018-05-29 格式:DOC 页数:40 大小:200.50KB
返回 下载 相关 举报
attribute在.net编程中的应用_第1页
第1页 / 共40页
attribute在.net编程中的应用_第2页
第2页 / 共40页
attribute在.net编程中的应用_第3页
第3页 / 共40页
attribute在.net编程中的应用_第4页
第4页 / 共40页
attribute在.net编程中的应用_第5页
第5页 / 共40页
点击查看更多>>
资源描述

《attribute在.net编程中的应用》由会员分享,可在线阅读,更多相关《attribute在.net编程中的应用(40页珍藏版)》请在金锄头文库上搜索。

1、Attribute 在在.net 编程中的应用编程中的应用Attribute 在在.net 编程中的应用(一)编程中的应用(一)Attribute 的基本概念 经常有朋友问,Attribute 是什么?它有什么用?好像没有这个东东程序也能运行。实际上在.Net 中,Attribute 是一个非常重要的组成部分,为了帮助大家理解和掌握 Attribute,以及它的使用方法,特地收集了几个 Attribute 使用的例子,提供给大家参考。在具体的演示之前,我想先大致介绍一下 Attribute。我们知道在类的成员中有 property 成员,二者在中文中都做属性解释,那么它们到底是不是同一个东西呢

2、?从代码上看,明显不同,首先就是它们的在代码中的位置不同,其次就是写法不同(Attribute 必须写在一对方括符中) 。什么是什么是 Atrribute首先,我们肯定 Attribute 是一个类,下面是 msdn 文档对它的描述:公共语言运行时允许你添加类似关键字的描述声明,叫做 attributes, 它对程序中的元素进行标注,如类型、字段、方法和属性等。Attributes 和 Microsoft .NET Framework 文件的元数据保存在一起,可以用来向运行时描述你的代码,或者在程序运行的时候影响应用程序的行为。在.NET 中,Attribute 被用来处理多种问题,比如序列化

3、、程序的安全特征、防止即时编译器对程序代码进行优化从而代码容易调试等等。下面,我们先来看几个在.NET 中标准的属性的使用,稍后我们再回过头来讨论 Attribute 这个类本身。 (文中的代码使用 C#编写,但同样适用所有基于.NET 的所有语言)Attribute 作为编译器的指令作为编译器的指令在 C#中存在着一定数量的编译器指令,如:#define DEBUG, #undefine DEBUG, #if 等。这些指令专属于 C#,而且在数量上是固定的。而 Attribute 用作编译器指令则不受数量限制。比如下面的三个 Attribute:Conditional:起条件编译的作用,只有

4、满足条件,才允许编译器对它的代码进行编译。一般在程序调试的时候使用。DllImport:用来标记非.NET 的函数,表明该方法在一个外部的 DLL 中定义。Obsolete:这个属性用来标记当前的方法已经被废弃,不再使用了。下面的代码演示了上述三个属性的使用:#define DEBUG /这里定义条件using System;using System.Runtime.InteropServices;using System.Diagnostics;namespace AttributeDemoclass MainProgramClassDllImport(“User32.dll“)public

5、 static extern int MessageBox(int hParent, string Message, string Caption, int Type);static void Main(string args)DisplayRunningMessage();DisplayDebugMessage();MessageBox(0,“Hello“,“Message“,0);Console.ReadLine();Conditional(“DEBUG“)private static void DisplayRunningMessage()Console.WriteLine(“开始运行

6、Main 子程序。当前时间是“+DateTime.Now);Conditional(“DEBUG“)Obsoleteprivate static void DisplayDebugMessage()Console.WriteLine(“开始 Main 子程序“); 如果在一个程序元素前面声明一个 Attribute,那么就表示这个 Attribute 被施加到该元素上,前面的代码,DllImport施加到 MessageBox 函数上, Conditional施加到DisplayRuntimeMessage 方法和 DisplayDebugMessage 方法,Obsolete施加到Displ

7、ayDebugMessage 方法上。根据上面涉及到的三个 Attribute 的说明,我们可以猜到程序运行的时候产生的输出:DllImport Attribute 表明了 MessageBox 是 User32.DLL 中的函数,这样我们就可以像内部方法一样调用这个函数。重要的一点就是 Attribute 就是一个类,所以 DllImport 也是一个类,Attribute 类是在编译的时候被实例化的,而不是像通常的类那样在运行时候才实例化。Attribute 实例化的时候根据该 Attribute 类的设计可以带参数,也可以不带参数,比如 DllImport 就带有“User32.dll“

8、的参数。Conditional 对满足参数的定义条件的代码进行编译,如果没有定义 DEBUG,那么该方法将不被编译,读者可以把#define DEBUG 一行注释掉看看输出的结果(release 版本,在 Debug 版本中 Conditional 的 debug 总是成立的) 。Obsolete 表明了DispalyDebugMessage 方法已经过时了,它有一个更好的方法来代替它,当我们的程序调用一个声明了 Obsolete 的方法时,那么编译器会给出信息,Obsolete 还有其他两个重载的版本。大家可以参考 msdn 中关于的 ObsoleteAttribute 类的描述。Attri

9、bute 类类除了.NET 提供的那些 Attribute 派生类之外,我们可以自定义我们自己的 Attribute,所有自定义的 Attribute 必须从 Attribute 类派生。现在我们来看一下 Attribute 类的细节:protected Attribute(): 保护的构造器,只能被 Attribute 的派生类调用。三个静态方法:static Attribute GetCustomAttribute():这个方法有8种重载的版本,它被用来取出施加在类成员上指定类型的 Attribute。static Attribute GetCustomAttributes(): 这个方法

10、有16种重载版本,用来取出施加在类成员上指定类型的 Attribute 数组。static bool IsDefined():由八种重载版本,看是否指定类型的定制 attribute 被施加到类的成员上面。实例方法:bool IsDefaultAttribute(): 如果 Attribute 的值是默认的值,那么返回 true。bool Match():表明这个 Attribute 实例是否等于一个指定的对象。公共属性: TypeId: 得到一个唯一的标识,这个标识被用来区分同一个 Attribute 的不同实例。我们简单地介绍了 Attribute 类的方法和属性,还有一些是从 objec

11、t 继承来的。这里就不列出来了。下面介绍如何自定义一个 Attribute: 自定义一个 Attribute 并不需要特别的知识,其实就和编写一个类差不多。自定义的 Attribute 必须直接或者间接地从 Attribute 这个类派生,如:public MyCustomAttribute : Attribute . 这里需要指出的是 Attribute 的命名规范,也就是你的 Attribute 的类名+“Attribute“,当你的Attribute 施加到一个程序的元素上的时候,编译器先查找你的 Attribute 的定义,如果没有找到,那么它就会查找“Attribute 名称“+At

12、tribute 的定义。如果都没有找到,那么编译器就报错。对于一个自定义的 Attribute,你可以通过 AttributeUsage 的 Attribute 来限定你的Attribute 所施加的元素的类型。代码形式如下: AttriubteUsage(参数设置) public 自定义 Attribute : Attribute . 非常有意思的是,AttributeUsage 本身也是一个 Attribute,这是专门施加在 Attribute 类的Attribute. AttributeUsage 自然也是从 Attribute 派生,它有一个带参数的构造器,这个参数是 Attribu

13、teTargets 的枚举类型。下面是 AttributeTargets 的定义:public enum AttributeTargetsAll=16383,Assembly=1,Module=2,Class=4,Struct=8,Enum=16,Constructor=32,Method=64,Property=128,Field=256,Event=512,Interface=1024,Parameter=2048,Delegate=4096,ReturnValue=8192 作为参数的 AttributeTarges 的值允许通过“或”操作来进行多个值得组合,如果你没有指定参数,那么默认

14、参数就是 All 。 AttributeUsage 除了继承 Attribute 的方法和属性之外,还定义了以下三个属性:AllowMultiple: 读取或者设置这个属性,表示是否可以对一个程序元素施加多个 Attribute 。Inherited:读取或者设置这个属性,表示是否施加的 Attribute 可以被派生类继承或者重载。ValidOn: 读取或者设置这个属性,指明 Attribute 可以被施加的元素的类型。AttributeUsage 的使用例子:的使用例子:using System; namespace AttTargsCS / 该 Attribute 只对类有效. Attr

15、ibuteUsage(AttributeTargets.Class)public class ClassTargetAttribute : Attribute / 该 Attribute 只对方法有效. AttributeUsage(AttributeTargets.Method)public class MethodTargetAttribute : Attribute / 该 Attribute 只对构造器有效。AttributeUsage(AttributeTargets.Constructor)public class ConstructorTargetAttribute : Attr

16、ibute / 该 Attribute 只对字段有效. AttributeUsage(AttributeTargets.Field)public class FieldTargetAttribute : Attribute / 该 Attribute 对类或者方法有效(组合). AttributeUsage(AttributeTargets.Class|AttributeTargets.Method)public class ClassMethodTargetAttribute : Attribute / 该 Attribute 对所有的元素有效.AttributeUsage(AttributeTargets.All)public class AllTargetsAttribute : Attribute /上面定义的 Attribute 施加到程序元素上的用法ClassTarget /施加到类

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号