C#給枚舉加自定義特性

通常我們需要定義一組特定值棋傍。采用枚舉再好不過了。它可以讓我們很方便直觀的管理一組固定的值。如果我們需要對應輸出枚舉值的漢語意思或者顏色樣式等,我們可以這樣實現(xiàn):

首先定義一個枚舉類

enum @enum
{
    Update = 1,
    Insert = 2
}

方式一(if語句)

if (@enum == 1)
{
    Console.Write("更新");
}
else (@enum == 2){
    Console.Write("新增");
}

方式二(switch語句)

switch(@enum)
{
    case 1:
        Console.Write("更新");
        break;
    case 2:
        Console.Write("新增");
        break;
}

方式三(采用字典)

Dictionary<int, string> dic = new Dictionary<int, string>
{
    [1] = "更新",
    [2] = "新增"
};
Console.Write(dic[@enum]);

現(xiàn)在我們用一種更加優(yōu)雅的方式來實現(xiàn)屑彻,給枚舉加特性

在System.ComponentModel命名空間下有一個特性Description,用來指定屬性或事件的描述顶吮。

enum @enum
{
    [Description("修改")]
    Update = 1,
    [Description("新增")]
    Insert = 2
}

我們可以寫一個擴展社牲,用來獲取Description特性,這用反射來讀取Description的值云矫,這個是復用性的

/// <summary>
/// 獲取特性 (DescriptionAttribute) 的說明膳沽;如果未使用該特性,則返回枚舉的名稱让禀。可指定的默認值陨界。
/// </summary>
/// <param name="enum"></param>
/// <param name="def">默認值</param>
/// <returns></returns>
public static string Description(this Enum @enum, string def = "")
{
    Type enumType = @enum.GetType();
    int value = int.Parse(Enum.Format(enumType, Enum.Parse(enumType, @enum.ToString()), "d"));
    FieldInfo fieldInfo = enumType.GetField(Enum.GetName(enumType, value));
    if (fieldInfo.GetCustomAttribute(typeof(DescriptionAttribute), false) is DescriptionAttribute descriptionAttribute)
    {
        return descriptionAttribute.Description;
    }
    return def != "" ? def : @enum.ToString();
}

那么在使用的時候我們將可以很方便的獲取枚舉值對應的描述信息

@enum.Update.Description();

這樣每次使用都只需要這一句代碼便可調出枚舉值的描述信息那么巡揍,如果還有其它需求怎么辦,比方說菌瘪,這個枚舉值還需要有代表色腮敌,樣式等用來渲染HTML的屬性怎么辦阱当,這里就用到了自定義特性,我們先說說怎么自定義特性糜工。其實很簡單弊添。
新建一個類,注意所有的特性類必須繼承自 Attribute捌木,代碼如下:

/// <summary>
/// 指定屬性的樣式
/// </summary>
public class ClassAttribute : Attribute
{
    /// <summary>
    /// 值
    /// </summary>
    public string Value{ get; set; }
    /// <summary>
    /// 設置值
    /// </summary>
    /// <param name="value"></param>
    public ClassAttribute(string value) => Value = value;
}

這樣一個自定義特性就建好了油坝,那么調用的方法,和Description一樣刨裆。但是如果每次添加一個自定義特性都得建立一個調取特性值的方法澈圈,是不是很累。我們要記住面向對象的三大特性之封裝帆啃。我們再寫一個擴展瞬女,這里用到了反射和泛型。

/// <summary>
/// 獲取指定特性的值
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="enum"></param>
/// <param name="def">默認值</param>
/// <returns></returns>
public static String GetAttribute<T>(this Enum @enum, String def = "") where T : Attribute
{
    object[] attributes = @enum.GetType().GetMember(@enum.ToString())[0].GetCustomAttributes(typeof(T), false);
    return attributes.Length > 0 ? attributes[0].PropertyValue("Value") : def;
}

我們需要更改一下枚舉

enum @enum
{
    [Description("修改"),Class("className")]
    Update = 1,
    [Description("新增"),Class("className")]
    Insert = 2
}

在使用的時候我們將可以很方便的獲取到自定義特性的值

@enum.Update.GetAttribute<ClassAttribute>();

使用的時候注意引用關系努潘。使用的時候根據(jù)實際需求做相應的調整诽偷。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市疯坤,隨后出現(xiàn)的幾起案子渤刃,更是在濱河造成了極大的恐慌,老刑警劉巖贴膘,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卖子,死亡現(xiàn)場離奇詭異,居然都是意外死亡刑峡,警方通過查閱死者的電腦和手機洋闽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來突梦,“玉大人诫舅,你說我怎么就攤上這事」迹” “怎么了刊懈?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長娃闲。 經常有香客問我虚汛,道長,這世上最難降的妖魔是什么皇帮? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任卷哩,我火速辦了婚禮,結果婚禮上属拾,老公的妹妹穿的比我還像新娘将谊。我一直安慰自己冷溶,他們只是感情好,可當我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布尊浓。 她就那樣靜靜地躺著逞频,像睡著了一般。 火紅的嫁衣襯著肌膚如雪栋齿。 梳的紋絲不亂的頭發(fā)上苗胀,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天,我揣著相機與錄音褒颈,去河邊找鬼柒巫。 笑死,一個胖子當著我的面吹牛谷丸,可吹牛的內容都是我干的堡掏。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼刨疼,長吁一口氣:“原來是場噩夢啊……” “哼泉唁!你這毒婦竟也來了?” 一聲冷哼從身側響起揩慕,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤亭畜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后迎卤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拴鸵,經...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年蜗搔,在試婚紗的時候發(fā)現(xiàn)自己被綠了劲藐。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡樟凄,死狀恐怖聘芜,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情缝龄,我是刑警寧澤汰现,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站叔壤,受9級特大地震影響瞎饲,放射性物質發(fā)生泄漏。R本人自食惡果不足惜百新,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一企软、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧饭望,春花似錦仗哨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至斟珊,卻和暖如春苇倡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背囤踩。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工旨椒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人堵漱。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓综慎,卻偏偏與公主長得像,于是被迫代替她去往敵國和親勤庐。 傳聞我的和親對象是個殘疾皇子示惊,可洞房花燭夜當晚...
    茶點故事閱讀 43,440評論 2 348