3.C#中通過反射來獲取Attribute中的信息


  閱讀目錄

  一:屬性

  二:自定義屬性類BookAttribute實例

  . 屬性是由屬性類來實現的,向上篇文章《C#溫故而知新學習系列之.NET框架高級特性—.NET框架中自身提供的屬性(二)》我們講的Obsolete一樣,我們還可以自定義屬性類,屬性類是由System.Attribute派生而來的

  . 在C#中為了方便起見,使用自定義屬性時可以省略屬性名后面的Attribute,比如:下面講到的[BookAttribute("自定義屬性類")]可以改寫為[Books("自定義屬性類")]

  . 自定義屬性類的特點

  1:使用AttributeUsage屬性可以限制屬性的用法

  AttributeUsage屬性包含一個名為AttributeTargets的枚舉可以用於指定何處使用自定義的屬性,比如:指定屬性僅用於類和結構[AttributeUsage(AttributeTargets.Class|AttributeTargets.Struct)]

  2:使用AttributeUsage屬性可以指定是否可以多次使用屬性

  在AttributeUsage屬性中通過指定AllowMultiple參數的值可以確定是否可以多次使用屬性,AllowMultiple值為true表示可以多次使用屬性,AllowMultiple值為false表示只能使用一次屬性,比如:[AttributeUsage(AllowMultiple=true)]

  3:可以設置屬性參數

  在屬性類的構造函數中給出的參數列表即為屬性參數

  二:自定義屬性類BookAttribute實例

  1:BookAttribute.cs

  namespace CustomAttributeClass
  {
      //僅限用於類,且可以多次使用屬性
      [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
      //繼承自Attribute類
      class BookAttribute:Attribute
      {
          private string _bookname;//私有字段

     /// <summary>
          /// 書本名稱屬性
          /// </summary>
          public string BookNmae
          {
              get { return _bookname; }
              set { _bookname = value; }
          }
          //構造函數,設置屬性參數
          public BookAttribute(string strBookName)
          {
              this._bookname = strBookName;
          }
      }
  }

  2:BookInfo.cs

  namespace CustomAttributeClass
  {

     //多次使用屬性類
      [Book("ASP.NET深入剖析系列")]
      [Book("C#完全學習手冊")]
      class BookInfo
      {
          public string bookinfo = "圖書信息如下";
          //構造函數
          public BookInfo()
          {

          }
      }
  }

  3:Program.cs

     static void Main(string[] args)
        {
            BookInfo bookinfo = new BookInfo();
            object[] bookarr;//對象數組
            //獲取對象類型,使用typeof方法檢索當前的類類型也就是BookInfo
            MemberInfo typeinfo = typeof(BookInfo);
    //調用GetCustomAttributes方法獲取與BookAttribute類有關的屬性列表,該方法返回一個對象數組
            bookarr = typeinfo.GetCustomAttributes(typeof(BookAttribute), false);
            if (bookarr.GetLength(0) != 0)
            {
                BookAttribute bookattribute1 = (BookAttribute)bookarr[0];//獲取屬性類的第一個成員
                BookAttribute bookattribute2 = (BookAttribute)bookarr[1];//獲取屬性類的第一個成員
                Console.WriteLine(bookinfo.bookinfo);
                Console.WriteLine("圖書名稱為:" + bookattribute1.BookNmae + "—" + bookattribute2.BookNmae);
                Console.ReadKey();
            }
        }

  

  

 

 


免責聲明!

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



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