最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c# 怎樣簡潔高效的實(shí)現(xiàn)多個(gè) Enum 自由轉(zhuǎn)換

 更新時(shí)間:2020年10月21日 10:49:50   作者:一線碼農(nóng)  
這篇文章主要介紹了c# 怎樣簡潔高效的實(shí)現(xiàn)多個(gè) Enum 自由轉(zhuǎn)換,幫助大家更好的進(jìn)行c# 開發(fā),感興趣的朋友可以了解下

一:背景

1. 講故事

前段時(shí)間和同事負(fù)責(zé)一個(gè)項(xiàng)目的兩個(gè)業(yè)務(wù)模塊,可能大家缺少溝通,導(dǎo)致本該定義一個(gè) Enum 的地方結(jié)果我倆各自定義了一個(gè),導(dǎo)致后面這兩個(gè) Enum 進(jìn)行對(duì)接就煩了,為了方便理解,也不想讓大家看這崴腳的英文拼寫,我就拿 銀行 舉例吧。

  • A同事 定義的枚舉
  public enum BankEnum
  {
    ICBC = 1,
    CMSB = 2,
    CMBC = 3
  }
  • B同事 定義的枚舉
  public enum ChinaBankEnum
  {
    中國民生銀行 = 1,
    中國工商銀行 = 2,
    中國招商銀行 = 3,
  }

這就很尬尷了,怎么將 ChinaBankEnum 轉(zhuǎn)成 BankEnum 呢? 為了尋求多快好省,本篇就聊聊這個(gè)問題。

二:尋找解決辦法

1. 手工匹配

本質(zhì)上就是找兩個(gè) Enum 的 mapping 關(guān)系,人肉匹配那是最簡單粗暴的,代碼如下:

    static BankEnum ConvertToEnum(ChinaBankEnum chinaBank)
    {
      switch (chinaBank)
      {
        case ChinaBankEnum.中國工商銀行: return BankEnum.ICBC;
        case ChinaBankEnum.中國民生銀行: return BankEnum.CMSB;
        case ChinaBankEnum.中國招商銀行: return BankEnum.CMBC;
      }

      return default(BankEnum);
    }

看的出來,這種寫法缺少靈活性,作為程序員肯定不能滿足于此,既然是找 mapping 關(guān)系,我相信很多朋友最早聽說 mapping 一詞是來源于 EntityFramework ,人家在處理 table 到 model 的 mapping 采用的是 Attribute,是不是這樣,靈感就在于此,我是不是也可以使用 Attribute 來標(biāo)記兩個(gè) Enum 的對(duì)應(yīng)關(guān)系呢???

2. 使用 Attribute

有了這個(gè)思路,就可以自定義一個(gè) Attribute,當(dāng)然比較懶的話,也可以用 Framework 自帶的 DescriptionAttribute,代碼如下:

  [AttributeUsage(AttributeTargets.All)]
  public class DescriptionAttribute : Attribute
  {
    public DescriptionAttribute(){}

    public DescriptionAttribute(string description){}
  }

接下來就可以把 Description 套在 BankEnum 上,如下代碼所示:

  public enum BankEnum
  {
    [Description(nameof(ChinaBankEnum.中國工商銀行))]
    ICBC = 1,

    [Description(nameof(ChinaBankEnum.中國民生銀行))]
    CMSB = 2,

    [Description(nameof(ChinaBankEnum.中國招商銀行))]
    CMBC = 3
  }

然后我可以通過反射拿到 Attribute 的值再去 ChinaBankEnum 中去找對(duì)應(yīng)的 key 即可,對(duì)不對(duì),為了方便理解,我封裝一個(gè) Enum 的擴(kuò)展方法,通過反射實(shí)現(xiàn) Enum 對(duì) Enum 的轉(zhuǎn)換,代碼如下:

  /// <summary>
  /// 枚舉的擴(kuò)展方法
  /// </summary>
  public static class EnumExtension
  {
    public static Target ConvertTo<Target>(this Enum enumValue) where Target : Enum
    {
      var key = Enum.GetName(enumValue.GetType(), enumValue);

      var fields = typeof(Target).GetFields();

      foreach (var field in fields)
      {
        var attribute = field.GetCustomAttribute<DescriptionAttribute>();

        if (attribute == null) continue;

        if (key == attribute.Description)
        {
          var obj = (Target)field.GetValue(typeof(Target));
          return obj;
        }
      }

      return default(Target);
    }
  }

代碼邏輯還是比較簡單的,接下來寫兩個(gè)例子測試下:

    static void Main(string[] args)
    {
      ChinaBankEnum chinaBankEnum = ChinaBankEnum.中國工商銀行;
      ChinaBankEnum chinaBankEnum2 = ChinaBankEnum.中國招商銀行;

      var bankEnum = chinaBankEnum.ConvertTo<BankEnum>();
      var bankEnum2 = chinaBankEnum2.ConvertTo<BankEnum>();

      Console.WriteLine($"{chinaBankEnum} -> {bankEnum}\r\n{chinaBankEnum2} -> {bankEnum2}");
    }

3. 對(duì) Parse 轉(zhuǎn)換的一些優(yōu)化

不知道大家在寫代碼的時(shí)候有沒有發(fā)現(xiàn)將 string 或者 int 轉(zhuǎn)成 Enum 的時(shí)候,寫出來的代碼是又臭又長,比如下面這樣:

 var bankEnum = (ChinaBankEnum)Enum.Parse(typeof(ChinaBankEnum), "中國工商銀行");

又是 typeof 又是類型強(qiáng)轉(zhuǎn)換,而且強(qiáng)轉(zhuǎn)不過來的話還會(huì)拋異常,基于各種原因 framework 又新增了一個(gè) TryParse,如下圖所示:

看起來確實(shí)好多了,但還是覺得有點(diǎn)不爽,為了再順眼一些,我決定在 EnumExtension 中再封裝一個(gè) TryParse 方法,如下代碼所示:

  public static class EnumExtension
  {
    public static T TryParse<T>(this string value) where T : struct
    {
      var isSucc = Enum.TryParse<T>(value, out var result);

      if (!isSucc) return default(T);

      return result;
    }
  }

調(diào)用的時(shí)候就可以這么來: var bankEnum = "中國工商銀行".TryParse<ChinaBankEnum>();,是不是就順眼多了哈。

三: 總結(jié)

哈,本篇就來自于項(xiàng)目開發(fā)中遇到的一個(gè)坑,相信很多朋友都會(huì)遇到類似的情況,遺憾的是默認(rèn)的 Enum 提供的功能太弱,大家可以根據(jù)自己的業(yè)務(wù)在 Enum 上擴(kuò)充更多實(shí)用的方法,如獲取所有的key,所有的value 等等,讓自己的代碼更加整潔,干凈,強(qiáng)大!

以上就是c# 怎樣簡潔高效的實(shí)現(xiàn)多個(gè) Enum 自由轉(zhuǎn)換的詳細(xì)內(nèi)容,更多關(guān)于c# Enum 自由轉(zhuǎn)換的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • WPF實(shí)現(xiàn)基礎(chǔ)控件之托盤的示例代碼

    WPF實(shí)現(xiàn)基礎(chǔ)控件之托盤的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用WPF實(shí)現(xiàn)托盤這一基礎(chǔ)控件,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定幫助,感興趣的小伙伴可以了解一下
    2022-10-10
  • c#實(shí)現(xiàn)用SQL池,多線程定時(shí)批量執(zhí)行SQL語句的方法

    c#實(shí)現(xiàn)用SQL池,多線程定時(shí)批量執(zhí)行SQL語句的方法

    構(gòu)建SQL池,分離業(yè)務(wù)邏輯層和數(shù)據(jù)訪問層,讓業(yè)務(wù)邏輯層從低效的數(shù)據(jù)庫操作解脫,以提高系統(tǒng)整體性能
    2013-10-10
  • C#獲取所有SQL Server數(shù)據(jù)庫名稱的方法

    C#獲取所有SQL Server數(shù)據(jù)庫名稱的方法

    這篇文章主要介紹了C#獲取所有SQL Server數(shù)據(jù)庫名稱的方法,涉及C#針對(duì)sql server數(shù)據(jù)庫的簡單查詢技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-08-08
  • C#發(fā)送和接收HTTP請(qǐng)求類HttpWebRequest的用法

    C#發(fā)送和接收HTTP請(qǐng)求類HttpWebRequest的用法

    這篇文章主要給大家介紹了關(guān)于C#發(fā)送和接收HTTP請(qǐng)求類HttpWebRequest用法的相關(guān)資料,C#中的HttpWebRequest是一個(gè)用于發(fā)送HTTP請(qǐng)求的類,它可以用于向Web服務(wù)器發(fā)送GET、POST、PUT、DELETE等請(qǐng)求,需要的朋友可以參考下
    2024-06-06
  • C# winform 請(qǐng)求http的實(shí)現(xiàn)(get,post)

    C# winform 請(qǐng)求http的實(shí)現(xiàn)(get,post)

    本文主要介紹了C# winform 請(qǐng)求http的實(shí)現(xiàn)(get,post),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • C#中的預(yù)處理器指令詳解

    C#中的預(yù)處理器指令詳解

    這篇文章主要介紹了C#中的預(yù)處理器指令詳解,本文講解了#define 和 #undef、#if、#elif、#else和#endif、#warning和#error、#region和#endregion、#line、#pragma等預(yù)處理器指令,需要的朋友可以參考下
    2015-01-01
  • C#定義簡單的反射工廠實(shí)例分析

    C#定義簡單的反射工廠實(shí)例分析

    這篇文章主要介紹了C#定義簡單的反射工廠的用法,實(shí)例分析了反射工廠的原理與使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-04-04
  • C#讀寫xml文件方法總結(jié)(超詳細(xì)!)

    C#讀寫xml文件方法總結(jié)(超詳細(xì)!)

    項(xiàng)目中用到關(guān)于xml文件讀寫操,所以下面這篇文章主要給大家介紹了關(guān)于C#讀寫xml文件方法的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • C#正則表達(dá)式實(shí)用大全(建議收藏!)

    C#正則表達(dá)式實(shí)用大全(建議收藏!)

    正則表達(dá)式是處理字符串的強(qiáng)大工具,擁有獨(dú)特的語法和獨(dú)立的處理引擎,下面這篇文章主要給大家介紹了關(guān)于C#正則表達(dá)式實(shí)用大全的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-03-03
  • C#基于Aspose.PDF實(shí)現(xiàn)PDF轉(zhuǎn)Word工具

    C#基于Aspose.PDF實(shí)現(xiàn)PDF轉(zhuǎn)Word工具

    這篇文章主要為大家介紹了C#如何基于Aspose.PDF庫,實(shí)現(xiàn)PDF文件轉(zhuǎn)為Word(DOC/DOCX)格式的功能,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-11-11

最新評(píng)論

芷江| 沂源县| 深圳市| 犍为县| 温州市| 焦作市| 分宜县| 湘阴县| 崇明县| 姚安县| 江口县| 五大连池市| 宿州市| 庆城县| 烟台市| 克什克腾旗| 南京市| 扎囊县| 天台县| 阳泉市| 内丘县| 尖扎县| 铜陵市| 平邑县| 许昌县| 商水县| 新化县| 大足县| 会宁县| 乐安县| 府谷县| 沙雅县| 正蓝旗| 焉耆| 彭阳县| 南昌市| 桐庐县| 蚌埠市| 车险| 通海县| 阜南县|