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 

 

Unity游戏开发——C#特性Attribute与自动化

这篇文章主要讲一下C#里面Attribute的使用方法及其可能的应用场景。比如你把玩家的血量、攻击、防御等属性写到枚举里面。然后界面可能有很多地方要根据这个枚举获取属性的描述文本。比如你做网络框架的时...
  • kakashi8841
  • kakashi8841
  • 2014年12月12日 14:40
  • 13043

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

原文链接Unity游戏开发——C#特性Attribute与自动化这篇文章主要讲一下C#里面Attribute的使用方法及其可能的应用场景。 比如你把玩家的血量、攻击、防御等属性写到枚举里面。然后界面...
  • RICKShaozhiheng
  • RICKShaozhiheng
  • 2016年06月07日 14:34
  • 1166

C# 中自定义Attribute值的获取与优化

C#自定义Attribute值的获取是开发中会经常用到的,一般我们的做法也就是用反射进行获取的,代码也不是很复杂。 1、首先有如下自定义的Attribute [AttributeUsage(A...
  • hegx2001
  • hegx2001
  • 2015年12月18日 15:46
  • 7202

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

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

C#特性Attribute的实际应用之:代码统计分析

  • 2010年12月29日 11:17
  • 386KB
  • 下载

c#中的特性(attribute)+反射的一个例子

  • 2008年08月01日 21:03
  • 45KB
  • 下载

C#特性Attribute的实际应用之:为应用程序提供多个版本

  • 2010年11月29日 18:15
  • 47KB
  • 下载

C# 特性(Attribute)

特性(Attribute)是用于在运行时传递程序中各种元素(比如类、方法、结构、枚举、组件等)的行为信息的声明性标签。您可以通过使用特性向程序添加声明性信息。一个声明性标签是通过放置在它所应用的元素前...
  • zm1_1zm
  • zm1_1zm
  • 2017年05月03日 13:15
  • 105

【C#】特性(Attribute)

C# 特性(Attribute) 特性(Attribute)是用于在运行时传递程序中各种元素(比如类、方法、结构、枚举、组件等)的行为信息的声明性标签。您可以通过使用特性向程序添加声明性信息。一个...
  • MR_XuZhe
  • MR_XuZhe
  • 2017年11月17日 08:52
  • 101

C# 特性(Attribute)

关于C# 特性可查看博文 http://liutiemeng.blog.51cto.com/120361/29201/ http://liutiemeng.blog.51cto.com...
  • zhangxu3649
  • zhangxu3649
  • 2016年11月10日 17:16
  • 112
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C# 特性(Attribute)(二)
举报原因:
原因补充:

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