C# 特性(Attribute)(二)

转载 2007年09月18日 14:02:00

 AttributeUsage类是另外一个预定义特性类,它帮助我们控制我们自己的定制特性的使用。它描述了一个定制特性如和被使用。  
  AttributeUsage
有三个属性,我们可以把它放置在定制属性前面。第一个属性是:  
  ValidOn  
  
通过这个属性,我们能够定义定制特性应该在何种程序实体前放置。一个属性可以被放置的所有程序实体在AttributeTargets enumerator中列出。通过OR操作我们可以把若干个AttributeTargets值组合起来。  
  AllowMultiple  
  
这个属性标记了我们的定制特性能否被重复放置在同一个程序实体前多次。 
  Inherited  
  
我们可以使用这个属性来控制定制特性的继承规则。它标记了我们的特性能否被继承。  
  
下面让我们来做一些实际的东西。我们将会在刚才的Help特性前放置AttributeUsage特性以期待在它的帮助下控制Help特性的使用。  
  using System;
  [AttributeUsage(AttributeTargets.Class), AllowMultiple = false,
   Inherited = false ]
  public class HelpAttribute : Attribute
  {
   public HelpAttribute(String Description_in)
   {
   this.description = Description_in;
   }
   protected String description;
   public String Description
   {
   get
   {
   return this.description;
   }
   }
  }
  
先让我们来看一下AttributeTargets.Class。它规定了Help特性只能被放在class的前面。这也就意味着下面的代码将会产生错误:
  
  [Help("this is a do-nothing class")]
  public class AnyClass
  {
   [Help("this is a do-nothing method")] //error
   public void AnyMethod()
   {
   }
  }
  
编译器报告错误如下:  
  AnyClass.cs: Attribute 'Help' is not valid on this declaration type.  
  It is valid on 'class' declarations only.  
  
我们可以使用AttributeTargets.All来允许Help特性被放置在任何程序实体前。可能的值是:  
  Assembly,
  Module,
  Class,
  Struct,
  Enum,
  Constructor,
  Method,
  Property,
  Field,
  Event,
  Interface,
  Parameter,
  Delegate,
  All = Assembly | Module | Class | Struct | Enum | Constructor | Method | Property | Field | Event | Interface | Parameter | Delegate,
  ClassMembers = Class | Struct | Enum | Constructor | Method | Property | Field | Event | Delegate | Interface )
  
下面考虑一下AllowMultiple = false。它规定了特性不能被重复放置多次。  
  [Help("this is a do-nothing class")]
  [Help("it contains a do-nothing method")]
  public class AnyClass
  {
   [Help("this is a do-nothing method")] //error
   public void AnyMethod()
   {
   }
  }
  
它产生了一个编译期错误。  
  AnyClass.cs: Duplicate 'Help' attribute  
  Ok,
现在我们来讨论一下最后的这个属性。Inherited, 表明当特性被放置在一个基类上时,它能否被派生类所继承。  
  [Help("BaseClass")]
  public class Base
  {
  }  
  public class Derive : Base
  {
  }
  
这里会有四种可能的组合:  
  [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false ]
  [AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = false ]
  [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = true ]
  [AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true ]
  
第一种情况:  
  
如果我们查询(Query)(稍后我们会看到如何在运行期查询一个类的特性)Derive类,我们将会发现Help特性并不存在,因为inherited属性被设置为false  
  
第二种情况:  
  
和第一种情况相同,因为inherited也被设置为false 
  
第三种情况:  
  
为了解释第三种和第四种情况,我们先来给派生类添加点代码:  
  [Help("BaseClass")]
  public class Base
  {
  }
  [Help("DeriveClass")]
  public class Derive : Base
  {
  }
  
现在我们来查询一下Help特性,我们只能得到派生类的属性,因为inherited被设置为true,但是AllowMultiple却被设置为false。因此基类的Help特性被派生类Help特性覆盖了。  
  
第四种情况:  
  
在这里,我们将会发现派生类既有基类的Help特性,也有自己的Help特性,因为AllowMultiple被设置为true 

 

相关文章推荐

C#自定义特性

元数据,就是C#中封装的一些类,无法修改.类成员的特性被称为元数据中的注释. 1、什么是特性      (1)属性与特性的区别          属性(Property):属性是面向对象思想里所...

C# 高级特性(二)Attribute和反射

使用Attribute的时候大多需要用到反射,所以放在一起。 Attribute: 我的理解是,它可以给你的类、方法、字段等添加一些描述性语言,在运行期间又可以通过反射的方法获取它的内容。 在编...

C# 特性(Attribute)入门

By sadaf alvi 翻译:cppbug (itwizard@163.com)  绪论  特性(Attributes)是一种崭新的声明性信息。我们不仅可以通过特性来定义设计层面的信息...

【C#语法】类和方法的特性Attribute

一、引言                 今天,我们来聊一下C#中的特性Attribute。何为特性Attribute?我们先看一个特性的使用例子,我们定义了一个Human类,但是由于某种原因该类不再...

C# 特性(Attribute)学习

特性(attribute)是被指定给某一声明的一则附加的声明性信息。在C#中,有一个小的预定义特性集合。在学习如何建立我们自己的定制特性(custom attributes)之前,我们先来看看在我们的...

C#编写自定义特性(Attribute)详解(转自:http://www.csharpwin.com/csharpspace/9349r9836.shtml)

 摘要:本文介绍C#编写自定义特性(Attribute),自定义属性本质上是直接或间接地从 System.Attribute 派生的传统类。与传统类一样,自定义属性也包含存储和检索数据的方法。要设计自...
  • lslxdx
  • lslxdx
  • 2011年04月02日 14:10
  • 795

【Unity】C#特性Attribute与自动化

原文链接Unity游戏开发——C#特性Attribute与自动化这篇文章主要讲一下C#里面Attribute的使用方法及其可能的应用场景。 比如你把玩家的血量、攻击、防御等属性写到枚举里面。然后界面...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C# 特性(Attribute)(二)
举报原因:
原因补充:

(最多只允许输入30个字)