一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C# - C#中如何為枚舉類型添加描述方法【小技巧】

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

2022-03-09 14:04LamondLu C#

相信很多人對枚舉并不陌生,枚舉可以很方便和直觀的管理一組特定值。下面這篇文章主要給大家介紹了關于C#中如何為枚舉類型添加描述方法的相關資料,需要的朋友可以參考下

背景

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

?
1
2
3
4
5
6
enum Color
{
  Red,
  Green,
  Blue
}

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

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

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

?
1
2
3
4
{
  enum-member-declarations,
  enum-member-declaration
}

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

例: 當前我們有如下枚舉Level

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public enum Level
{
 //Bad
 B = -1,
 
 //Normal
 N = 0,
 
 //Good
 G = 1,
 
 //Very Good
 VG = 2
}

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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個潛在的問題:

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

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

使用DescriptionAttribute重構代碼

其實.NET中已經提供了一個文本描述屬性類DescriptionAttribute, 這個屬性類的構造函數可以接收一段文字描述。

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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
}

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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)
  {
   //如果沒有定義描述,就把當前枚舉值的對應名稱返回
   return val.ToString();
  }
 
  return (attributes.Single() as DescriptionAttribute).Description;
 }
}

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

總結

本篇博文中,我們講解了如果如何C#中如何為枚舉類型添加描述方法,它不僅可以減少重復代碼,還可以讓整個枚舉類型的內聚性更高。

原文鏈接:http://www.cnblogs.com/lwqlun/p/10380992.html

延伸 · 閱讀

精彩推薦
  • C#C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    這篇文章主要介紹了C# 實現對PPT文檔加密、解密及重置密碼的操作方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下...

    E-iceblue5012022-02-12
  • C#深入解析C#中的交錯數組與隱式類型的數組

    深入解析C#中的交錯數組與隱式類型的數組

    這篇文章主要介紹了深入解析C#中的交錯數組與隱式類型的數組,隱式類型的數組通常與匿名類型以及對象初始值設定項和集合初始值設定項一起使用,需要的...

    C#教程網6172021-11-09
  • C#C#裁剪,縮放,清晰度,水印處理操作示例

    C#裁剪,縮放,清晰度,水印處理操作示例

    這篇文章主要為大家詳細介紹了C#裁剪,縮放,清晰度,水印處理操作示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    吳 劍8332021-12-08
  • C#C#實現XML文件讀取

    C#實現XML文件讀取

    這篇文章主要為大家詳細介紹了C#實現XML文件讀取的相關代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    Just_for_Myself6702022-02-22
  • C#C#通過KD樹進行距離最近點的查找

    C#通過KD樹進行距離最近點的查找

    這篇文章主要為大家詳細介紹了C#通過KD樹進行距離最近點的查找,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    帆帆帆6112022-01-22
  • C#Unity3D實現虛擬按鈕控制人物移動效果

    Unity3D實現虛擬按鈕控制人物移動效果

    這篇文章主要為大家詳細介紹了Unity3D實現虛擬按鈕控制人物移動效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一...

    shenqingyu060520232410972022-03-11
  • C#WPF 自定義雷達圖開發實例教程

    WPF 自定義雷達圖開發實例教程

    這篇文章主要介紹了WPF 自定義雷達圖開發實例教程,本文介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下...

    WinterFish13112021-12-06
  • C#C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    這篇文章主要介紹了C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題,簡單描述了訪問者模式的定義并結合具體實例形式分析了C#使用訪問者模式解決長...

    GhostRider9502022-01-21
主站蜘蛛池模板: 国产精品每日在线观看男人的天堂 | se婷婷| 国产日产精品久久久久快鸭 | 99re这里只有精品视频在线观看 | 美女下面揉出水免费视频 | 亚洲va国产日韩欧美精品色婷婷 | 日韩欧美在线视频一区二区 | yellow视频在线观看 | 亚洲福利一区二区 | 青草国产福利视频免费观看 | 垫底辣妹免费观看完整版 | 亚洲精品第二页 | 欧美日韩精品一区二区三区高清视频 | 红色毛片 | 欧洲破处| 精品久久久久免费极品大片 | 女同学用白丝脚玩我的故事 | 国产伦码精品一区二区三区 | 欧美区在线 | 無码一区中文字幕少妇熟女网站 | 接吻吃胸摸下面啪啪教程 | 国产精品久久久久a影院 | 欧美日一级片 | 2021最新国产成人精品免费 | 成人精品视频 成人影院 | 美国videos | 91精品综合久久久久久五月天 | 九九99热久久精品在线6 | 免费网站看v片在线香蕉 | 国产一卡2卡3卡四卡精品网 | 任我淫 | 臀控福利大臀的网站 | 日本亚洲娇小与黑人tube | spy2wc48美女撒尿| 国内精品视频免费观看 | 亚洲国产精品ⅴa在线观看 亚洲国产高清一区二区三区 | 欧美亚洲高清日韩成人 | 精品国产自在在线在线观看 | 亚洲一区二区三区免费视频 | 99精品视频一区在线观看miya | 日产中文乱码卡一卡二 |