科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件在Visual C sharp中定义和使用自己的特性(2)

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

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

自定义特性有点类似于XML,它最大的好处不在于“它做了什么”,它真正最大的好处在于“你可以用它做什么”。这个是真正无止境的,由于自定义特性本身具有开放的特性,这使得它可以拥有更多新颖的用途。

作者:David Tansey 来源:天极网 2007年8月31日

关键字:

  • 评论
  • 分享微博
  • 分享邮件

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

Attribute Description
Designer 指定用于为组件实现设计时服务的类。
DefaultProperty 指定在属性表单中,组件的默认的属性。
Category 指定在属性表单中,属性的类别。
Description 指定在属性表单中,有关属性的描述。

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

自定义特性vs.类的属性

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

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

表格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 ; }

}

}

}

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章