C#特性

Posted chengjunde

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#特性相关的知识,希望对你有一定的参考价值。

转自:

      http://blog.csdn.net/nndtdx/article/details/6905802

http://www.cnblogs.com/luckdv/articles/Atrribute.html#3321438

http://www.cnblogs.com/kai364/p/4417436.html

      http://www.cnblogs.com/mahaisong/category/326195.html

    http://www.cnblogs.com/fenrir/archive/2008/09/08/1286388.html

       http://blog.csdn.net/yuwuji/article/details/6958304

        http://www.cnblogs.com/ghfsusan/archive/2009/07/15/1524192.html(比较好的介绍)

        http://www.cnblogs.com/rohelm/archive/2012/04/19/2456088.html 

        http://blog.csdn.net/pan_junbiao/article/details/8461703

 

        http://www.runoob.com/csharp/csharp-attribute.html

       http://www.cnblogs.com/xugang/archive/2011/01/06/1927619.html

C# AttributeUsage的使用是如何的呢?首先让我们来了解一下什么是AttributeUsage类它是另外一个预定义特性类,AttributeUsage类的作用就是帮助我们控制定制特性的使用。其实AttributeUsage类就是描述了一个定制特性如和被使用。

  C# AttributeUsage的使用要明白:

  AttributeUsage有三个属性,我们可以把它放置在定制属性前面。第一个属性是:

  ◆ValidOn 
  
  通过这个属性,我们能够定义定制特性应该在何种程序实体前放置。一个属性可以被放置的所有程序实体在AttributeTargets enumerator中列出。通过OR操作我们可以把若干个AttributeTargets值组合起来。

  ◆AllowMultiple 
  
 
  这个属性标记了我们的定制特性能否被重复放置在同一个程序实体前多次。

  ◆Inherited 
  
  我们可以使用这个属性来控制定制特性的继承规则。它标记了我们的特性能否被继承。

  C# AttributeUsage的使用实例:

  下面让我们来做一些实际的东西。我们将会在刚才的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   
  {   
  } 

  C# AttributeUsage的使用会有四种可能的组合:


  
  [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 ] 

  C# AttributeUsage的使用第一种情况:

  如果我们查询(Query)(稍后我们会看到如何在运行期查询一个类的特性)Derive类,我们将会发现Help特性并不存在,因为inherited属性被设置为false。

  C# AttributeUsage的使用第二种情况:

  和第一种情况相同,因为inherited也被设置为false。

  C# AttributeUsage的使用第三种情况:

  为了解释第三种和第四种情况,我们先来给派生类添加点代码: 


  
  [Help("BaseClass")]   
  public class Base   
  {   
  }   
  [Help("DeriveClass")]   
  public class Derive : Base   
  {   
  } 

  现在我们来查询一下Help特性,我们只能得到派生类的属性,因为inherited被设置为true,但是AllowMultiple却被设置为false。因此基类的Help特性被派生类Help特性覆盖了。

  C# AttributeUsage的使用第四种情况:

  在这里,我们将会发现派生类既有基类的Help特性,也有自己的Help特性,因为AllowMultiple被设置为true。

  C# AttributeUsage的相关内容就向你介绍到这里,希望对你了解和掌握C# AttributeUsage的使用有所帮助。

AttributeUsage

  System.AttributeUsage声明一个Attribute的使用范围与使用原则。

  

  AllowMultiple 和 Inherited 参数是可选的,所以此代码具有相同的效果:

  

  AttributeTarget的值可以参考1。部分可取值如下:

  

  如果 AllowMultiple 参数设置为 true,则返回特性可对单个实体应用多次。

  如果 Inherited 设置为 false,则该特性不由从特性化的类派生的类继承。

  Attribute.GetCustomAttribute可以获取一个类的Attribute。

[AttributeUsage(AttributeTargets.Class)]
    public class VersionAttribute : Attribute
    {
        public string Name { get; set; }
        public string Date { get; set; }
        public string Describtion { get; set; }
    }

 [Version(Name = "hyddd", Date = "2009-07-20", Describtion = "hyddd\'s class")]
    public class MyCode
    {
        //...
    }

 class Program
    {
        static void Main(string[] args)
        {
            var info = typeof(MyCode);
            var classAttribute = (VersionAttribute)Attribute.GetCustomAttribute(info, typeof(VersionAttribute));
            Console.WriteLine(classAttribute.Name);
            Console.WriteLine(classAttribute.Date);
            Console.WriteLine(classAttribute.Describtion);
        }
    }
复制代码
[AttributeUsage(AttributeTargets.Class)]
    public class VersionAttribute : Attribute
    {
        public string Name { get; set; }
        public string Date { get; set; }
        public string Describtion { get; set; }
    }

 [Version(Name = "hyddd", Date = "2009-07-20", Describtion = "hyddd\'s class")]
    public class MyCode
    {
        //...
    }

 class Program
    {
        static void Main(string[] args)
        {
            var info = typeof(MyCode);
            var classAttribute = (VersionAttribute)Attribute.GetCustomAttribute(info, typeof(VersionAttribute));
            Console.WriteLine(classAttribute.Name);
            Console.WriteLine(classAttribute.Date);
            Console.WriteLine(classAttribute.Describtion);
        }
    }
复制代码

以上是关于C#特性的主要内容,如果未能解决你的问题,请参考以下文章

此 Canon SDK C++ 代码片段的等效 C# 代码是啥?

是否可以动态编译和执行 C# 代码片段?

C#常用代码片段备忘

优化 C# 代码片段、ObservableCollection 和 AddRange

Unity常用标签

VS2015使用技巧 打开代码片段C#部分