属性类

从抽象类 System.Attribute 派生的类(不论是直接的还是间接的)都称为属性类。一个关于属性类的声明定义一种新属性,它可以被放置在其他声明上。按照约定,属性类的名称带有 Attribute 后缀。使用属性时可以包含或省略此后缀。http://msdn.microsoft.com/zh-cn/library/aa664612%28v=vs.71%29.aspx

AttributeUsage 属性(第 17.4.1 节)用于描述使用属性类的方式。

AttributeUsage 具有一个定位参数(第 17.1.2 节),该参数使属性类能够指定自己可以用在那种声明上。示例

 
 
using System;
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface)]
public class SimpleAttribute: Attribute 
{
   ...
}

定义了一个名为 SimpleAttribute 的属性类,此属性类只能放在类声明和接口声明上。示例

 
 
[Simple] class Class1 {...}
[Simple] interface Interface1 {...}

显示了 Simple 属性的几种用法。虽然此属性是用名称 SimpleAttribute 定义的,但在使用时可以省略 Attribute 后缀,从而得到简称 Simple。因此,上例在语义上等效于:

 
 
[SimpleAttribute] class Class1 {...}
[SimpleAttribute] interface Interface1 {...}

AttributeUsage 还具有一个名为 AllowMultiple 的命名参数(第 17.1.2 节),此参数用于说明对于某个给定实体,是否可以多次使用该属性。如果属性类的 AllowMultiple 为 true,则此属性类是多次性属性类,可以在一个实体上多次被应用。如果属性类的 AllowMultiple 为 false 或未指定的,则此属性类是一次性属性类,在一个实体上最多只能使用一次。

示例

 
 
using System;
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
public class AuthorAttribute: Attribute
{ 
   private string name;
   public AuthorAttribute(string name) {
      this.name = name;
   }
   public string Name { 
      get { return name; } 
   }
}

定义了一个名为 AuthorAttribute 的多次性属性类。示例

 
 
[Author("Brian Kernighan"), Author("Dennis Ritchie")] 
class Class1
{
   ...
}

显示了一个两次使用 Author 属性的类声明。

AttributeUsage 具有另一个名为 Inherited 的命名参数,此参数指示在基类上指定该属性时,该属性是否也会被从此基类派生的类所继承。如果属性类的 Inherited 为 true,则该属性会被继承。如果属性类的 Inherited 为 false 或者未指定,那么该属性不会被继承。

没有附加 AttributeUsage 属性的属性类 X,例如

 
 
using System;
class X: Attribute {...}

等效于下面的内容:

 
 
using System;
[AttributeUsage(
   AttributeTargets.All, 
   AllowMultiple = false, 
   Inherited = true)
]
class X: Attribute {...}
http://msdn.microsoft.com/zh-cn/library/aa664613%28v=vs.71%29.aspx

属性类可以具有定位参数和命名参数。属性类的每个公共实例构造函数为该属性类定义一个有效的定位参数序列。属性类的每个非静态公共读写字段和属性为该属性类定义一个命名参数。

示例

 
 
using System;
[AttributeUsage(AttributeTargets.Class)]
public class HelpAttribute: Attribute
{
   public HelpAttribute(string url) {      // Positional parameter
      ...
   }
   public string Topic {                  // Named parameter
      get {...}
      set {...}
   }
   public string Url {
      get {...}
   }

}

定义了一个名为 HelpAttribute 的属性类,它具有一个定位参数 (url) 和一个命名参数 (Topic)。虽然 Url 属性是非静态的和公共的,但由于它不是读写的,因此它并不定义命名参数。

此属性类可以如下方式使用:

 
 
[Help("http://www.example.com/.../Class1.htm")]
class Class1
{
   ...
}
[Help("http://www.example.com/.../Misc.htm", Topic = "Class2")]
class Class2
{
   ...
}
原文地址:https://www.cnblogs.com/zhaoxinshanwei/p/3983865.html