C#特性(Attribute)-現(xiàn)學現(xiàn)用

前言

想要靈性的使用C#反射機制射亏,特性(Attribute)的使用是必不可少的反砌。

C# 特性(Attribute) 簡介

Attribute 中文譯為 屬性。而C#特征已有 Property 屬性一詞费奸。

講究先來后到包雀,Attribute被譯為了特性。

菜鳥教程定義:

特性(Attribute)是用于在運行時傳遞程序中各種元素(比如類孩饼、方法髓削、結構、枚舉镀娶、組件等)的行為信息的聲明性標簽立膛。您可以通過使用特性向程序添加聲明性信息。一個聲明性標簽是通過放置在它所應用的元素前面的方括號([ ])來描述的梯码。

"標簽"這個詞很好的解釋了Attribute的作用宝泵。

還有"注釋"一詞

特性是可以添加到編程元素(例如程序集,類型轩娶,成員和參數(shù))的注釋儿奶。它們存儲在程序集的元數(shù)據(jù)中,可以使用反射API在運行時訪問罢坝。例如廓握,框架定義了ObsoleteAttribute,它可以應用于類型或成員嘁酿,以指示已棄用類型或成員隙券。

特性(Attribute)用于添加元數(shù)據(jù),如編譯器指令和注釋闹司、描述娱仔、方法、類等其他信息游桩。.Net 框架提供了兩種類型的特性:預定義特性和自定義特性牲迫。

預定義特性(Attribute)

.Net 框架提供了三種預定義特性:

  • AttributeUsage
  • Conditional
  • Obsolete

代碼摘選自菜鳥教程

預定義特性 AttributeUsage 描述了如何使用一個自定義特性類。它規(guī)定了特性可應用到的項目的類型借卧。

規(guī)定該特性的語法如下:

[AttributeUsage(
   validon,
   AllowMultiple=allowmultiple,
   Inherited=inherited
)]

其中:

  • 參數(shù) validon 規(guī)定特性可被放置的語言元素盹憎。它是枚舉器 AttributeTargets 的值的組合。默認值是 AttributeTargets.All铐刘。
  • 參數(shù) allowmultiple(可選的)為該特性的 AllowMultiple 屬性(property)提供一個布爾值陪每。如果為 true,則該特性是多用的。默認值是 false(單用的)檩禾。
  • 參數(shù) inherited(可選的)為該特性的 Inherited 屬性(property)提供一個布爾值挂签。如果為 true,則該特性可被派生類繼承盼产。默認值是 false(不被繼承)饵婆。

例如:

[AttributeUsage(AttributeTargets.Class |
AttributeTargets.Constructor |
AttributeTargets.Field |
AttributeTargets.Method |
AttributeTargets.Property, 
Inherited = true,
AllowMultiple = true)]
public class BaseAttribute : Attribute
...

創(chuàng)建自定義特性(Attribute)

.Net 框架允許創(chuàng)建自定義特性,用于存儲聲明性的信息戏售,且可在運行時被檢索侨核。該信息根據(jù)設計標準和應用程序需要,可與任何目標元素相關蜈项。

創(chuàng)建并使用自定義特性包含四個步驟:

  • 聲明自定義特性
  • 構建自定義特性
  • 在目標程序元素上應用自定義特性
  • 通過反射訪問特性

聲明自定義特性

定義一個用來存儲數(shù)據(jù)表名的類芹关,一個新的自定義特性應派生自 System.Attribute 類

using System;

namespace DataHelper.Attributes
{
    /// <summary>
    /// 該特性表明了該類可以用來生成sql語句,參數(shù)為空的情況下紧卒,則使用該類的名稱作為表名
    /// </summary>
    [System.AttributeUsage(AttributeTargets.Class, Inherited = true, AllowMultiple = false)]
    public sealed class TableNameAttribute : Attribute
    {
        readonly string tableName;

        /// <summary>
        /// 指定表名
        /// </summary>
        /// <param name="tableName"></param>
        public TableNameAttribute(string tableName = null)
        {
            if (string.IsNullOrEmpty(tableName))
                tableName = this.GetType().Name;
            this.tableName = tableName;
        }

        public string TableName
        {
            get { return tableName; }
        }
    }
}

使用自定義特性

[TableName("media")]
public class Media
{
    ...
}

獲取指定特性

/// <summary>
/// 獲得表名
/// 若沒有使用TableName 指定表名侥衬,則使用類名作為表名
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
private string GetTableName<T>()
{
    var type = typeof(T);
    var result = ((TableNameAttribute)type
    .GetCustomAttributes(typeof(TableNameAttribute), false).FirstOrDefault())
    ?.TableName ?? type.Name;
        return result;
}

Talks

菜鳥教程(Attribute)

袁智遠MySqlHelper

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市跑芳,隨后出現(xiàn)的幾起案子轴总,更是在濱河造成了極大的恐慌,老刑警劉巖博个,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件怀樟,死亡現(xiàn)場離奇詭異,居然都是意外死亡盆佣,警方通過查閱死者的電腦和手機往堡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來共耍,“玉大人虑灰,你說我怎么就攤上這事”远担” “怎么了穆咐?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長字旭。 經常有香客問我对湃,道長,這世上最難降的妖魔是什么遗淳? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任拍柒,我火速辦了婚禮,結果婚禮上屈暗,老公的妹妹穿的比我還像新娘拆讯。我一直安慰自己剧包,他們只是感情好,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布往果。 她就那樣靜靜地躺著,像睡著了一般一铅。 火紅的嫁衣襯著肌膚如雪陕贮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天潘飘,我揣著相機與錄音肮之,去河邊找鬼。 笑死卜录,一個胖子當著我的面吹牛戈擒,可吹牛的內容都是我干的。 我是一名探鬼主播艰毒,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼筐高,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了丑瞧?” 一聲冷哼從身側響起柑土,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎绊汹,沒想到半個月后稽屏,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡西乖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年狐榔,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片获雕。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡薄腻,死狀恐怖,靈堂內的尸體忽然破棺而出典鸡,到底是詐尸還是另有隱情被廓,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布萝玷,位于F島的核電站嫁乘,受9級特大地震影響,放射性物質發(fā)生泄漏球碉。R本人自食惡果不足惜蜓斧,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望睁冬。 院中可真熱鬧挎春,春花似錦看疙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至脚线,卻和暖如春搁胆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背邮绿。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工渠旁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人船逮。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓顾腊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親挖胃。 傳聞我的和親對象是個殘疾皇子杂靶,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)冠骄,斷路器伪煤,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,504評論 25 707
  • 前言:本來打算將特性(Attribute)和反射(Reflection)寫在一章里,但感覺反射(Reflectio...
    地壇公園閱讀 1,041評論 0 0
  • 一個人吃飯 一個人逛街 一個人看海 一個人旅游 越長大越孤單 一個人 一座城 陌生的城市 開始來這充滿好奇凛辣,一切都...
    冷默然閱讀 355評論 0 0
  • 曾幾何時一個人喜歡站在高聳的山峰或高樓的陽臺上眺望遠處的風景抱既,有時清晰可見,有時模糊不清 夜晚的風微微涼扁誓,吹過面頰...
    默魔陌閱讀 424評論 2 3