频道直达:新闻 - 组网 - 安全 - 服务器 - 存储 - 系统 - 应用 - 开发 - 数据库 - 前沿 - 技术人 - 培训 - 求职 - 读书 - 教程 - 专题 - 产品 - 案例 - 技术圈 - 博客 - BBS
51CTO.COM_中国领先的IT技术网站
找资料:

在Visual C#中定义和使用自己的特性(1)

作者: David Tansey 出处:天极网 2007-08-28 11:15    砖    好    评论   进入论坛
阅读提示:本文利用一个简单的例子,介绍了开发者如何使用.NET特性提高开发进程。自定义特性有点类似于XML,它最大的好处不在于“它做了什么”,它真正最大的好处在于“你可以用它做什么”。这个是真正无止境的,由于自定义特性本身具有开放的特性,这使得它可以拥有更多新颖的用途。

复杂的,面向组件的业务开发,期待现代的软件开发工程师们具备更多的弹性设计,而不是过去的方法设计。微软的.NET框架通过众所周知的声明式编程,广泛的使用特性来附加额外的功能。在软件系统里,特性可以增强系统的弹性,这是因为,特性使功能的松耦合得到了增强。所以,你可以定制自己的特性类,然后根据你自己的意图,合理的使用这些具有松耦合功效的特性。

使用.NET框架编写Windows程序,在很多方面已经变得很简单。在许多情况下,.NET框架使用.NET编译器在编译时绑定到程序集的元数据,.使灵活的程序设计变得更容易。事实上,对于.NET而言,使用内嵌的元数据把我们从DLL地狱解脱出来是可能的。

值得庆幸的是,.NET框架的设计者们并没有选择把这些元数据优雅的隐藏起来。设计者们把反射API给予了我们,通过反射,一个.NET程序可以通过编程查看这个元数据。一个程序可以反射出包含在特定程序集内任意的东西,或者说是包含在其内的所有的类型和成员。

把元数据绑定到可执行的程序集里,提供了许多优势。这使得.NET程序集,完全可以自我描述。还允许开发者跨语言共享组件,去除了头文件的需要。(这些头文件会由于相关的实现代码而过期。)

关于.NET元数据所有积极的消息,看起来很难相信,它好像什么也没有,仅仅是个谎言。但是,它确实是存在的。在.NET里,你可以创建自己特定程序的元数据,并且可以把这些元数据应用到你可以想象到的地方。

开发者通过使用自定义特性,可以定义他们自己特定程序的元数据。因为这些特性的值将变成另一部分元数据,绑定到一个程序集里。所以这些自定义特性的值可以被反射API检查到并且可以被使用。

我们经常提到一个类的属性,这些属性的值可以作为特性来使用。那么属性和自定义特性真正的区别在哪里呢?

通过这篇文章,你将学会如何定制特性,如何把特性应用到你的源代码类和方法上,以及如何使用反射API获取和使用这些特性的值。

公共语言运行时是如何使用特性的?

在你开始考虑如何使用你自己定义的特性类之前,让我们查看一些标准的特性,这些已经在公共语言运行时有用到。

[WebMethod]特性提供了一个简单的例子。它可以使WebService派生的子类中任意公共的方法转化成Web Service暴露方法的一部分,而这一切,仅仅通过把[WebMethod]附加到方法的定义上就可以做到。

public class SomeWebService : System.Web.Services.WebService
{
[WebMethod]
public DataSet GetDailySales()
{
//处理请求的代码
}
}

你只要把[WebMethod]特性添加到一个方法上,.NET就会在后台为你处理其它所有的事情。

在给定的方法上使用[Conditional]特性,那么此方法是否可调用将取决于指定的预处理标识符是否被定义。举个例子,看如下的代码:

public class SomeClass
{
[Conditional("DEBUG")]
public void UnitTest()
{
//单元测试代码
}
}

这段代码说明,该类的方法UnitTest()是否有效,将取决于预处理标识符“DEBUG”是否被定义(译注:在编译调试版本时,DEBUG常数已经被定义)。我们可能更感兴趣的是,使用[Conditional]后真正发生了什么。当条件失效时,编译器将会停止所有对该方法的调用,相比有同样功能的预处理指令#if...#endif,此方法显得更简洁,而且,使用这项功能,我们不需要多做任何事情。

特性使用了定位参数和命名参数。在使用了[Conditional]特性的例子中,特定的符号就是定位参数。定位参数是强制性的,你必须提供。

让我们回到使用了[WebMethod]特性的例子,来看一下命名参数。这个特性有一个Description的命名参数,可以像下面这样使用:

[WebMethod(Description = "Sales volume")]

命名参数是可选择的,参数的值要紧跟着写在参数名字的后面。如果存在定位参数,那么你需要先书写定位参数,然后在定位参数的后面书写命名参数。

我将会在文章的后面讲述更多关于定位参数和命名参数的内容,这将在我向你展示如何创建和使用你自己的特性类时提到。

特性可用于运行时,设计时

在这篇文章里,我提供的都是与运行时的行为相关的例子。但是二进制文件(程序集)并不只是用于运行时。在.NET里,你所定义的元数据也不只是局限于运行时,相反,当你编译成程序集后,在任何时候你都可以查阅这些元数据。

考虑在设计时,使用元数据的一些可能的情况。在Visual Studio.Net里,使用IDE可以构建工具(使用.NET语言),方便开发和设计(向导,构建器等等)。这样,一个模块的运行时的环境(如:IDE工具)就成了另一个模块的设计时环境(被开发的源代码)。这里提供了一个使用定制特性很好的例子。IDE工具将会反射你编写的类和类型,然后遵照你的代码行事。不幸的是,由于没有IDE工具的代码,探究这样的例子,已经超出了该文章所阐述的范围。

标准的.NET特性包含了一个类似的例子。当一个开发者创建自定义控件并把它放到Visual Studio.Net IDE的工具箱中,它们(自定义控件)已经使用了一系列特性,用于说明在属性表单中如何处理自定义控件。Table1列举并描述了在属性表单中用到的4种标准的.NET特性。



共4页: 1 [2] [3] [4] 下一页
【内容导航】
专题
C#实用基础教程
C#技术开发指南
初探敏捷开发
WCF开发基础
体验Visual Studio 2008的魅力
我也说两句

匿名发表

(如果看不清请点击图片进行更换)


中 国 领 先 的 IT 技 术 网 站 ·
技 术 成 就 梦 想
·Java基础教程 (查看81024次)
·UML类图详解 (查看72498次)
·C++是垃圾语言?! (查看42631次)
·C#技术开发指南 (查看40232次)
·UML统一建模语言 (查看39205次)
·Java编程开发手册 (1198个砖)
·Java基础教程 (431个砖)
·C#技术开发指南 (311个砖)
·.NET开发手册 (254个砖)
·PB开发教程 (223个砖)
·Java编程开发手册 (658个好)
·Java基础教程 (578个好)
·.NET开发手册 (282个好)
·PB开发教程 (213个好)
·Delphi开发技术手册 (200个好)
订阅技术快讯
电子杂志下载
名称:SQL Server数据库管理精品黄皮书
简介:书中文章经过精挑细选,便于用户能根据自己的实际工作和学习,快速在本书寻找到相关资料。内容涵盖了SQL Server的安装与升级、语句查询、数据备份和恢复、自动化任务、数据同步、数据字典、安全和预防、性能和优化、集群等各方面应用信息,以及DBA管理人员在数据库管理工作中
名称:2007路由技术大全
简介:《2007路由技术大全》由51CTO.com网站特别策划制作,该书包括路由器技术、路由器产品、路由器配置、安全设置、路由器故障处理、路由器密码恢复,以及广大网友在实践使用中的心得经验和技巧文章,内容注重实用性,适用于初学者入门,也适合多年从业者提高,是一本实践和理论完
名称:网络安全精品应用黄皮书
简介:《2007精品网络安全黄皮书》包括了9个大类24个小类, 800余篇文章,内容包含了熊猫烧香病毒、DDOS攻击、ARP病等热点问题的介绍及解决方案。从病毒查杀、防范、系统、数据等各方面的安全设置到黑客技术的了解、防范,涉及到了安全应用的全部领域, 由浅至深内容全面。