欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#自定義特性(Attribute)詳解

 更新時間:2022年04月13日 09:15:22   作者:Ruby_Lu  
本文詳細講解了C#的自定義特性(Attribute),文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

在前面介紹的代碼中有使用特性,這些特性都是Microsoft定義好的,作為.NET Framework類庫的一部分,許多特性都得到了C#編譯器的支持。
.NET Frmework也允許定義自己的特性。自定義特性允許把自定義元數據與程序元素關聯(lián)起來。這些元數據是在編譯過程中創(chuàng)建的,并嵌入到程序集中。這些特性不會影響編譯過程,因為編譯器不能識別它們,但這些特性在應用于程序元素時,可以在編譯好的程序集中用作元數據。這些元數據在文檔說明中很有用。使自定義特性起很大作用的是反射(http://www.dbjr.com.cn/article/244259.htm)技術,代碼可以讀取這些元數據,使用它們在運行期間作決策。

編寫自定義特性

[FieldName("Social")]
        public string SocialNumber
        {
            ...
        }

當C#編譯器發(fā)現(xiàn)SocialNumber屬性應用了一個FieldName特性時,首先會把字符串Attribute追加到FieldName這個名稱后面,形成一個組合名稱FieldNameAttribute,然后在其搜索路徑的所有名稱空間(即在using語句中提及的名稱空間)中搜索FieldNameAttribute類。但如果該特性的名稱以字符串Attribute結尾,編譯器就不會把這個字符串加到組合名稱中。
因此上面的代碼等價于:

[FieldNameAttribute("Social")]
        public string SocialNumber
        {
            ...
        }

1.AttributeUsage特性

自定義的特性類需要直接或間接派生自System.Attribute。這個類還應包含控制用法的信息:

  • *特性可以應用到哪些類型的程序元素上(類,結構,屬性和方法等)
  • *特性是否可以多次應用到同一個程序元素上
  • *特性在應用到類或接口上時,是否由派生類和接口繼承
  • *這個特性有哪些必選和可選參數

如果編譯器找不到對應的特性類,或者找到一個這樣的特性類,但使用特性的方式與特性類中的信息不匹配,編譯器就會產生一個編譯錯誤。
定義FieldNameAttribute特性

[AttributeUsage(AttributeTargets.Property, AllowMultiple=false, Inherited=false)]
        public class FieldNameAttribute:Attribute
        {
            private string name;
            public FieldNameAttribute(string name)
            {
                this.name = name;
            }
        }

特性類FieldNameAttribute本身用了一個特性System.AttributeUsage來標記。這是Microsoft定義的一個特性,C#編譯器為它提供了特殊的支持。AttributeUsage主要用于標識自定義特性可以應用到哪些類型的程序元素上。這些信息由它的第一個參數AttributeTargets給出,該參數是必選的,其類型是枚舉類型AttributeTargets。上面的例子,指定FieldNameAttribute特性只能應用到屬性上。
AttributeTargets枚舉的成員如下:

上面列出了可以應用該特性的所有程序元素。在把特性應用到程序元素上時,應把特性放在元素前面的方括號中:

  [FieldName("Social")]
  public string SocialNumber
  {
    ...
  }

但在應用到Assembly和Module時,特性可以應用到整個程序集或模塊中,而不是應用到代碼中的一個元素上,在這種情況下,這個特性可以放在源代碼的任何地方,但需要使用關鍵字Assembly和Module作為前綴:

  [assembly:FieldName("Social")]
  [module:FieldName("Social")]

在指定自定義特性的有效目標元素時,可以使用OR運算符(|)把這些值組合起來:

  [AttributeUsage(AttributeTargets.Property |AttributeTargets.Field,
    AllowMultiple=false, Inherited=false)]
  public class FieldNameAttribute:Attribute
  {
    private string name;
    public FieldNameAttribute(string name)
    {
      this.name = name;
    }
  }

也可以使用AttributeTargets.All指定自定義特性可以應用到所有類型的程序元素上。
AttributeUsage特性還包含另外兩個參數:AllowMultiple和Inherited。它們用不同的語法來指定:參數名 = 參數值,而不是只給出這些參數的值。這些參數是可選的。

  • AllowMultiple參數表示一個特性是否可以多次應用到同一項上。
  • Inherited參數表示應用到類或接口上的特性是否自動應用到所以派生的類或接口上。如果特性應用到方法或屬性上,它就自動應用到它們的重寫版本上。

2.指定特性參數

  [FieldName("Social")]
  public string SocialNumber
  {
    ...
  }

編譯器會檢查傳遞給特性的參數(在本例中,是一個字符串),并產兆該特性類中帶這些參數的構造函數。如果找到匹配的構造函數,編譯器就會把指定的元數據傳遞給程序集。如果找不到,就會生成一個編譯錯誤。反射()會從程序集中讀取元數據,并實例化它們表示的特性類。因此,編譯器需要確保存在這樣的構造函數,才能在運行期間實例化指定的特性。

3.特性的可選參數

在AttributeUsage特性中,使用參數名 = 參數值語法把可選參數添加到特性中。這種語法指定可選參數的名稱和值,它通過特性類中的公共屬性或字段起作用:

[AttributeUsage(AttributeTargets.Property, AllowMultiple=false, Inherited=false)]
        public class FieldNameAttribute:Attribute
        {
            private string name;
            public FieldNameAttribute(string name)
            {
                this.name = name;
            }
            
            public string Comment
            {
                get;set;
            }
        }
        
        
        [FieldName("Social",Comment="可選參數值")]
        public string SocialNumber
        {
            ...
        }

到此這篇關于C#自定義特性(Attribute)的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • C#多態(tài)的三種實現(xiàn)方式(小結)

    C#多態(tài)的三種實現(xiàn)方式(小結)

    這篇文章主要介紹了C#多態(tài)的三種實現(xiàn)方式(小結),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • C#語言中條件與&&與條件或||的區(qū)別

    C#語言中條件與&&與條件或||的區(qū)別

    這篇文章主要介紹了&&:邏輯與,前后條件同時滿足表達式為真 ||:邏輯或,前后條件只要有一個滿足表達式為真,下面結合案例給大家介紹,需要的朋友可以參考下
    2015-07-07
  • C# 鍵值對數據排序代碼

    C# 鍵值對數據排序代碼

    這篇文章介紹了C# 鍵值對數據排序代碼,有需要的朋友可以參考一下
    2013-11-11
  • C#實現(xiàn)狀態(tài)欄提示信息功能的示例

    C#實現(xiàn)狀態(tài)欄提示信息功能的示例

    今天小編就為大家分享一篇C#實現(xiàn)狀態(tài)欄提示信息功能的示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06
  • c#項目將dll打包到exe中的步驟

    c#項目將dll打包到exe中的步驟

    這篇文章主要介紹了c#項目將dll打包到exe中的步驟,幫助大家更好的理解和學習使用c#,感興趣的朋友可以了解下
    2021-04-04
  • C#從數據庫讀取圖片并保存的兩種方法

    C#從數據庫讀取圖片并保存的兩種方法

    這篇文章主要介紹了C#從數據庫讀取圖片并保存的方法,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2021-01-01
  • C#連接SQL數據庫和查詢數據功能的操作技巧

    C#連接SQL數據庫和查詢數據功能的操作技巧

    本文給大家分享C#連接SQL數據庫和查詢數據功能的操作技巧,本文通過圖文并茂的形式給大家介紹的非常詳細,需要的朋友參考下吧
    2021-05-05
  • C#實現(xiàn)的JS操作類實例

    C#實現(xiàn)的JS操作類實例

    這篇文章主要介紹了C#實現(xiàn)的JS操作類,封裝了C#關于javascript的彈出對話框、返回上一頁、跳轉等常用操作,非常具有實用價值,需要的朋友可以參考下
    2015-03-03
  • 在Winform程序中使用Spire.Pdf實現(xiàn)頁面添加印章功能的實現(xiàn)

    在Winform程序中使用Spire.Pdf實現(xiàn)頁面添加印章功能的實現(xiàn)

    這篇文章主要介紹了在Winform程序中使用Spire.Pdf實現(xiàn)頁面添加印章功能的實現(xiàn),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • C#實現(xiàn)掃雷游戲

    C#實現(xiàn)掃雷游戲

    這篇文章主要為大家詳細介紹了C#實現(xiàn)掃雷游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06

最新評論