国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#中如何為枚舉類型添加描述方法【小技巧】

2020-01-24 00:10:16
字體:
供稿:網(wǎng)友

背景

在我們的日常開發(fā)中,我們會經(jīng)常使用枚舉類型。枚舉類型(enum type)是具有一組命名常量的獨特的值類型。在以下示例中:

enum Color{   Red,  Green,  Blue}

聲明一個名為 Color 的枚舉類型,該類型具有三個成員:Red、Green 和 Blue。

枚舉具體是怎么聲明呢?枚舉聲明用于聲明新的枚舉類型。枚舉聲明以關(guān)鍵字 enum 開始,然后定義該枚舉類型的名稱、可訪問性、基礎(chǔ)類型和成員。具體格式:

修飾詞(new、public、protected、internal、private)enum 枚舉類型名:整數(shù)類型

{   enum-member-declarations,  enum-member-declaration}

有時我們只需要顯示枚舉的值或者枚舉值對應(yīng)名稱, 但是在某些場景下,我們可能需要將枚舉值顯示為不同的字符串。

例: 當(dāng)前我們有如下枚舉Level

 public enum Level {  //Bad  B = -1,  //Normal  N = 0,  //Good  G = 1,  //Very Good   VG = 2 }

這個枚舉有4個可選值B, N, G, VG。 現(xiàn)在我們希望用Bad, Normal, Good, Very Good作為B, N, G, VG的顯示值。

那我們會怎么做呢?通常我們最常想到的就是針對Level枚舉類型編寫一個擴展方法。

 public static class LevelEnumExtension {  public static string ToDescription(this Level level)  {   switch (level)   {    case Level.B:     return "Bad";    case Level.G:     return "Good";    case Level.N:     return "Normal";    case Level.VG:     return "Very Good";    default:     return "Normal";   }  } }

以上的代碼在我們的項目中很常用。但是這里有2個潛在的問題:

  • 我們的項目中可能不止一種枚舉類型,所以我們可能就需要為每一種類型都添加一個對應(yīng)的擴展方法。
  • 枚舉值和枚舉的顯示值的代碼位置是分離的,如果你查找枚舉值對應(yīng)的顯示值,你就要先去找到對應(yīng)的枚舉擴展方法。

那么如何改進這部分代碼,從而消除上述2個問題呢,這時候我們就要引入.NET中的文本描述屬性類DescriptionAttribute。

使用DescriptionAttribute重構(gòu)代碼

其實.NET中已經(jīng)提供了一個文本描述屬性類DescriptionAttribute, 這個屬性類的構(gòu)造函數(shù)可以接收一段文字描述。

下面我們使用DescriptionAttribute來改造Level枚舉類型。

 public enum Level {  //Bad  [Description("Bad")]  B = -1,  //Normal  [Description("Normal")]  N = 0,  //Good  [Description("Good")]  G = 1,  //Very Good   [Description("Very Good")]  VG = 2 }

這樣我們上面提到的第二個問題就解決了,現(xiàn)在Level枚舉類型的枚舉值和顯示值就都封裝在了一起。

那么第一個問題該怎么解決呢?

這里我們可以針對Enum類型添加擴展方法,并使用反射讀取當(dāng)前枚舉值所對應(yīng)的顯示值

 public static class EnumExtension {  public static string ToDescription(this Enum val)  {   var type = val.GetType();   var memberInfo = type.GetMember(val.ToString());      var attributes = memberInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false);   if (attributes == null || attributes.Length != 1)   {    //如果沒有定義描述,就把當(dāng)前枚舉值的對應(yīng)名稱返回    return val.ToString();   }   return (attributes.Single() as DescriptionAttribute).Description;  } }

由于Enum類型是所有枚舉類型的基類型,所以所有的枚舉類型都可以使用這個擴展方法。

總結(jié)

本篇博文中,我們講解了如果如何.NET內(nèi)置的文本描述屬性類DescriptionAttribute來生成枚舉值對應(yīng)的文本,它不僅可以減少重復(fù)代碼,還可以讓整個枚舉類型的內(nèi)聚性更高。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 横峰县| 曲松县| 屯门区| 濮阳市| 金山区| 清河县| 蒙阴县| 温泉县| 全椒县| 石棉县| 循化| 云和县| 崇义县| 黑河市| 鄄城县| 铜梁县| 广东省| 霍山县| 林西县| 临洮县| 南康市| 陆丰市| 新晃| 正蓝旗| 治多县| 南开区| 怀集县| 卓尼县| 东方市| 邵阳市| 南汇区| 白城市| 阜城县| 栾城县| 衡山县| 绵竹市| 沙田区| 包头市| 沙田区| 石河子市| 朝阳市|