C# AttributeUsage的使用淺析


  C# AttributeUsage的使用是如何的呢?首先讓我們來了解一下什么是AttributeUsage類它是另外一個預定義特性類,AttributeUsage類的作用就是幫助我們控制定制特性的使用。其實AttributeUsage類就是描述了一個定制特性如和被使用。

  C# AttributeUsage的使用要明白:

  AttributeUsage有三個屬性,我們可以把它放置在定制屬性前面。第一個屬性是:

  ◆ValidOn 
  
  通過這個屬性,我們能夠定義定制特性應該在何種程序實體前放置。一個屬性可以被放置的所有程序實體在AttributeTargets enumerator中列出。通過OR操作我們可以把若干個AttributeTargets值組合起來。

  ◆AllowMultiple 
  
 
  這個屬性標記了我們的定制特性能否被重復放置在同一個程序實體前多次。

  ◆Inherited 
  
  我們可以使用這個屬性來控制定制特性的繼承規則。它標記了我們的特性能否被繼承。

 

  C# AttributeUsage的使用實例:

  下面讓我們來做一些實際的東西。我們將會在剛才的Help特性前放置AttributeUsage特性以期待在它的幫助下控制Help特性的使用。

    [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")]     //error
    public class AnyClass
    {
        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。

            var type = typeof(Derive);
            Assert.False(type.IsDefined(typeof(HelpAttribute),true));
            Assert.False(type.IsDefined(typeof(HelpAttribute), false));

  C# AttributeUsage的使用第二種情況:

  和第一種情況相同,因為inherited也被設置為false。

 

  C# AttributeUsage的使用第三種情況:

  對於第三種和第四種,通過類型查找都是一樣的

        [Fact]
        public void AttributeTest()
        {
            var type = typeof(Derive);
            Assert.True(type.IsDefined(typeof(HelpAttribute),true));
            Assert.False(type.IsDefined(typeof(HelpAttribute), false));
        }

  我們給派生類添加點代碼,來解釋第三種和第四種情況,: 

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

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

  現在我們來查詢一下Help特性,我們只能得到派生類的屬性,因為inherited被設置為true,但是AllowMultiple卻被設置為false。因此基類的Help特性被派生類Help特性覆蓋了。

            var type = typeof(Derive);
            //Assert.True(type.IsDefined(typeof(HelpAttribute),true));
            //Assert.False(type.IsDefined(typeof(HelpAttribute), false));
            Assert.True(type.GetCustomAttributes(true).Count() == 1);

 

  C# AttributeUsage的使用第四種情況:

  在這里,我們將會發現派生類既有基類的Help特性,也有自己的Help特性,因為AllowMultiple被設置為true。

            var type = typeof(Derive);
            //Assert.True(type.IsDefined(typeof(HelpAttribute),true));
            //Assert.False(type.IsDefined(typeof(HelpAttribute), false));
            Assert.True(type.GetCustomAttributes(true).Count() > 1);

 

  C# AttributeUsage的相關內容就向你介紹到這里,希望對你了解和掌握C# AttributeUsage的使用有所幫助。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM