首页 | 互联网 | IT动态 | Cisco | Windows | Linux | Java | .Net | Oracle | 华为 | 存储世界 | 服务器 | 网络设备 | IDC | 安全 | 求职招聘
IT培训 | 数字网校 | 技术专题 | 电子书下载 | 教学视频 | 网页设计 | 平面设计 | 解决方案 | 直播室 | 虚拟考场 | 搜索 | 博客 | 沙龙 | 论坛
首页 | JAVA | C# | VB | VB.NET | C/C++ | delphi | 工程管理 | 其他语言 | 论坛
各大城市软件开发培训、软件人才免费咨询热线:400-700-5807
 您现在的位置: 中国IT实验室 >> 桌面开发 >> C# >> 文章正文
在Visual C#中定义和使用自己的特性
来源:ChinaItLab 作者:佚名 时间:2007-8-30



  Table 1: 在Visual Studio .NET IDE里设计时属性表单用到的标准的.NET特性.

Attribute

DescriptionXML:namespace prefix = o />

Designer

指定用于为组件实现设计时服务的类。

DefaultProperty

指定在属性表单中,组件的默认的属性。

Category

指定在属性表单中,属性的类别。

Description

指定在属性表单中,有关属性的描述。


  这些与表单相关的特性,让我们认识到,可以在设计时使用特性以及它们的值,就像在运行时一样。

自定义特性vs.类的属性

  在特性和类的属性之间存在着明显相似的地方。这给我们何时,何处应该使用自定义特性带来了困惑。开发者们通常引用一个类的属性,并把属性的值作为自己“特性”,那么属性和特性之间真正的区别在哪里呢?

  当你定义特性的时候,它和属性没有根本的区别,使用时,可以以相同的方式把它附加到程序集不同的类型上,而不仅仅在类上使用。Table2列举了可以应用特性的所有程序集类型。

  Table 2:可以应用特性的所有程序集类型。

Type

Assembly

Class

Delegate

Enum

Event

Interface

Method

Module

Parameter

Constructor

Field

Property

ReturnValue

Structure


  让我们从清单中挑选一个作为例子。你可以在参数上应用特性,这看起来很微小,好像是在给参数添加属性?其实,这是一个新颖的,非常不错的主意,因为你不会用类的属性做这件事。这里也突出了特性和属性之间很大的不同之处,因为属性仅仅是类的一个成员而已。它们不能与一个参数,或者清单中列举的其他类型关联起来,当然,这要把类排除在外。

  在另外的方面,类的属性被限制在运行的环境下,而特性却没有被限制。通过定义,一个属性就依赖于特定的类,这个属性仅仅可以通过类的实例访问,或者通过该类派生类的实例访问。另一方面,特性却可以应用到任何地方。在assembly类型上应用特性,以检验是否与自定义特性中的相匹配,这对于assembly类型来说,是最适合的了。在下一部分,我将更多的讨论自定义特性类中的ValidOn属性。在面向组件的开发中,这是非常有用的,因为特性的这个特征将更加促进松耦合。

  特性和属性之间另外的一个不同的地方将涉及到它们各自存储的值。属性成员的值是一个实例化的值,在运行时,是可以被改变的。而特性的值,是在设计时(在源代码里)设定,然后直接把这些特性的值编译成元数据保存到程序集里。之后,你将不能改变这些特性的值。实际上,你已经把这些特性的值,变成硬编码的、只读的数据。

  考虑一下,你应用特性的时候。举个例子,在一个类定义的时候,给其附加了一个特性,那么该类的每一个实例都会拥有相同的分配给此特性值,而不论你实例化该类的多少个实例。你不能把特性附加到一个类的实例上,你只可以在类型/类的定义上应用特性。

  创建一个自定义特性类

  现在,综合以上的描述,我们将演示一个更实际的实现过程。让我们创建一个自定义特性类。该特性会保存一些关于代码修改的跟踪信息,在源代码里,这些都将作为注释。在这个例子里,我们将仅仅记录一些条目:缺陷id,开发者id,修改的日期,导致缺陷的原因,以及有关修正的注释。为了保持例子足够的简单,我们将关注于如何创建一个自定义特性类(DefectTrackAttribute),而该特性类仅被用于类和方法上。

  DefectTrackAttribute定义的代码如下:

using System;

namespace MyAttributeClasses
{
[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method,AllowMultiple = true)]
public class DefectTrackAttribute :Attribute
{
private string cDefectID ;
private DateTime dModificationDate ;
private string cDeveloperID ;
private string cDefectOrigin ;
private string cFixComment ;

public DefectTrackAttribute ()
{

}

public DefectTrackAttribute(
string lcDefectID,
string lcModificationDate,
string lcDeveloperID )
{
this.cDefectID = lcDefectID ;
this.dModificationDate =
System.DateTime.Parse( lcModificationDate ) ;
this.cDeveloperID = lcDeveloperID ;
}

public string DefectID
{
get { return cDefectID ; }
}

public string ModificationDate
{
get
{
return dModificationDate.ToShortDateString() ;
}
}

public string DeveloperID
{
get { return cDeveloperID ; }
}

public string Origin
{
get { return cDefectOrigin ; }
set { cDefectOrigin = value ; }
}

public string FixComment
{
get { return cFixComment ; }
set { cFixComment = value ; }
}


}
}

 

上一页  [1] [2] [3] [4] [5] 下一页  

【责编:Youping】
中国IT教育热线咨询
相关文章
如何使用Delphi实现无边界窗体的移动
C语言中的位域的使用
用Visual C#实现网络封包监视
Java程序开发中代理技术的使用方法
在VB.NET编程中使用数组
使用C++异常来取代exit()函数
怎样使用Eclipse平台调试您的软件项目
在Java中使用Draw2D和SWT绘图
定义客户需求的原则和方法
推荐文章

 精彩友情推荐
·锐捷交换机报价
·锐捷交换机
·锐捷网络网络交换机
·smc交换机
·smc交换机报价
·IDC资讯大全
·机房品质万里行
·IDC托管必备知识
·全国IDC报价
·网站推广优化
最新更新 推荐文章
·框架:J2EE WEB应用架构分析03-13
·几种VC++数据库开发技术的相对比…03-13
·利用C#实现标注式消息提示窗口03-13
·用C#创建COM对象03-13
·Visual C#多线程参数传递浅析03-13
·Visual C#多线程参数传递浅析03-13
·基于HOOK和MMF的Win密码渗透技术11-15
·Visual C++设计超强仿QQ自动伸缩…11-15
·Java SE 6.0实现高质量桌面集成开…11-15
·史玉柱东山再起幕后高人11-15
·Visual Basic 9.0隐式类型的局部…09-30
·用C#创建COM对象09-06
·IT管理十大失误及其对策08-30
·VC中利用MFC设计绘图程序初步08-23
·JAVA中对象创建和初始化过程08-23
·C语言中的位域的使用08-09
·浅谈Java桌面应用程序开发08-09
·C#的前途如何?08-02
·几种VC++数据库开发技术的相对比较07-12
·用Visual C#实现网络封包监视07-12
·VB.NET中的TextBox控件详解07-12
·VB.NET实现PC与掌上电脑PPC的双向通信07-05