要设计本身的自定义属性,没必要掌握许多新的概念。若是熟悉面向对象的编程,而且知道如何设计类,就已具有了所需的大部分知识。自定义属性本质上是直接或间接地从 System.Attribute 派生的传统类。与传统类同样,自定义属性也包含存储和检索数据的方法。html
正确设计自定义属性类的主要步骤以下:jquery
应用 AttributeUsageAttribute程序员
声明属性类编程
声明构造函数app
声明属性ide
本节描述上述每一个步骤,并以自定义属性示例结束。函数
应用 AttributeUsageAttributeui
自定义属性声明以 AttributeUsageAttribute 开始,而该属性定义属性类的一些主要属性。例如,可指定属性是否可被其余类继承,或指定属性可应用到哪些元素。下列代码段说明了如何使用 AttributeUsageAttribute。this
[AttributeUsage(AttributeTargets.All, Inherited = false, AllowMultiple = true)]spa
System.AttributeUsageAttribute 类包含三个对自定义属性的建立具备重要意义的成员:AttributeTargets、Inherited 和 AllowMultiple。
AttributeTargets 成员
在前面的示例中指定了 AttributeTargets.All,指示该属性能够应用到全部程序元素。还能够指定 AttributeTargets.Class,指示属性只能够应用于某个类;或指定 AttributeTargets.Method,指示属性只能够应用于某个方法。全部程序元素均可经过这种方式由自定义属性标记,以便对其进行描述。
还可传递 AttributeTargets 的多个实例。下列代码段指定自定义属性可应用到任何类或方法。
[AttributeUsage (AttributeTargets.Class | AttributeTargets.Method)]
继承属性
Inherited 属性指示属性是否可由从该属性应用到的类派生的类继承。该属性采用 true(默认值)或 false 标志。例如,在下面的代码示例中,MyAttribute 的默认 Inherited 值为 true,而 YourAttribute 的 Inherited 值为 false。
而后,这两个属性应用到基类 MyClass 中的某个方法。
最后,YourClass 类从基类 MyClass 继承。方法 MyMethod 显示 MyAttribute,而不是 YourAttribute。
AllowMultiple 属性
AllowMultiple 属性指示元素中是否可存在属性的多个实例。若是设置为 true,则容许存在多个实例;若是设置为 false(默认值),则只容许存在一个实例。
在下面的代码示例中,MyAttribute 的默认 AllowMultiple 值为 false,而 YourAttribute 的对应值为 true。
当应用这些属性的多个实例时,MyAttribute 将生成编译器错误。下面的代码示例显示 YourAttribute 的有效用法和 MyAttribute 的无效用法。
若是 AllowMultiple 属性和 Inherited 属性都设置为 true,则从另外一个类继承的类能够继承一个属性,并在同一子类中应用同一属性的另外一个实例。若是 AllowMultiple 设置为 false,则父类中的全部属性值将被子类中同一属性的新实例重写。
声明属性类
应用了 AttributeUsageAttribute 后,能够开始定义属性细节。属性类的声明与传统类的声明相似,以下列代码所示:
此属性定义说明了下列几点:
属性类必须声明为公共类。
按照约定,属性类的名称以单词 Attribute 结尾。虽然并不要求这样,但出于可读性目的,建议采用此约定。应用属性时,能够选择是否包含 Attribute 一词。
全部属性类都必须直接或间接地从 System.Attribute 继承。
在 Microsoft Visual Basic 中,全部自定义属性类都必须具备 AttributeUsageAttribute 属性。
声明构造函数
用构造函数初始化属性的方法与对待传统类的方法相同。下列代码段阐释了典型的属性构造函数。该公共构造函数采用一个参数,并将其值设置为与成员变量相等。
public MyAttribute(bool myvalue){ this.myvalue = myvalue; }
可重载该构造函数以适应值的不一样组合。若是同时为自定义属性类定义了属性,则在初始化属性时可以使用命名参数和定位参数的组合。一般状况下,将全部必选参数定义为定位参数,将全部可选参数定义为命名参数。在这种状况下,若是没有必选参数,则没法初始化属性。其余全部参数都是可选参数。请注意,在 Visual Basic 中,属性类的构造函数不该使用 ParamArray 参数。
下面的代码示例显示如何使用可选参数和必选参数应用使用上例中的构造函数的属性。它假定该属性有一个必选布尔值和一个可选字符串属性。
//One required (positional) and one optional (named) parameter are applied.[MyAttribute(false, OptionalParameter = "optional data")]//One required (positional) parameter is applied.[MyAttribute(false)]
声明属性
若是须要定义命名参数,或者要提供一种容易的方法来返回由属性存储的值,请声明属性。应将属性属性声明为带有要返回的数据类型说明的公共实体。定义将保存属性值的变量,并将该变量与 get 方法和 set 方法关联。下面的代码示例说明如何在属性中实现一个简单的属性。
public bool MyProperty{ get {return this.myvalue;} set {this.myvalue = value;}}
自定义属性示例
本节具体表现前面的信息,并显示如何设计一个简单的属性来记录有关代码段做者的信息。该示例中的属性存储程序员的名字和级别,和关于该代码是否已被复查过的信息。该示例使用三个私有变量存储要保存的实际值。每一个变量用获取和设置这些值的公共属性表示。最后,用两个必选参数定义构造函数。
可经过下列方法之一,使用全名 DeveloperAttribute 或使用缩写名 Developer 来应用该属性。
[Developer("Joan Smith", "1")]
[Developer("Joan Smith", "1", Reviewed = true)]
第一个示例显示只用必选命名参数应用的属性,而第二个示例显示同时使用必选参数和可选参数应用的属性。
更多资料:http://msdn.microsoft.com/zh-cn/library/tw5zxet9.aspx
具体应用:www.vadimv.com
本文来自永恒的记忆的博客,原文地址:http://www.cnblogs.com/salam/archive/2010/11/09/1872428.html