c# 如何將列舉以下拉資料來源的形式返回給前端

2023-06-08 12:00:56

前言:

  相信各位有碰到過與我類似的問題,當表中存一些狀態的欄位,無非以下幾種形式1.直接寫死 如: 正常:1,異常:2 ,還有一種則是寫在字典中,再或者就是加在列舉上,前兩者對於返回下拉資料來源來說比較好處理,直接寫死和查資料庫,但都有各自的缺點,寫死維護比較麻煩,查資料庫也沒必要,這個時候列舉就可以解決這個問題.

實現邏輯:

  要返回一個List<StartStateEnum>,其中包含列舉型別StartStateEnum的所有欄位值,你可以使用反射來實現。以下是一個範例程式碼,演示瞭如何將列舉型別中的欄位值新增到集合並返回:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.ComponentModel;
 4 using System.Reflection;
 5 
 6 public class Program
 7 {
 8     public enum StartStateEnum
 9     {
10         [Description("啟動")]
11         Start = 0,
12         
13         [Description("未啟動")]
14         NotStart = 1
15     }
16     
17     public static void Main(string[] args)
18     {
19         // 獲取列舉欄位值的集合
20         List<StartStateEnum> enumValues = GetEnumValues<StartStateEnum>();
21         
22         // 輸出集合中的欄位值
23         foreach (var value in enumValues)
24         {
25             Console.WriteLine(value);
26         }
27     }
28     
29     public static List<T> GetEnumValues<T>()
30     {
31         // 獲取列舉型別
32         Type enumType = typeof(T);
33         
34         // 驗證是否為列舉型別
35         if (!enumType.IsEnum)
36         {
37             throw new ArgumentException("The specified type is not an enum.");
38         }
39         
40         // 獲取列舉中的所有欄位
41         FieldInfo[] fields = enumType.GetFields(BindingFlags.Public | BindingFlags.Static);
42         
43         // 儲存欄位值的集合
44         List<T> enumValues = new List<T>();
45         
46         // 遍歷欄位並新增欄位值到集合
47         foreach (var field in fields)
48         {
49             if (field.FieldType == enumType)
50             {
51                 T value = (T)field.GetValue(null);
52                 enumValues.Add(value);
53             }
54         }
55         
56         return enumValues;
57     }
58 }

在上述範例中,我們定義了一個名為StartStateEnum的列舉型別,其中包含了兩個值:StartNotStart。每個值都具有一個DescriptionAttribute,其中包含了對應的描述。

Main方法中,我們呼叫GetEnumValues方法來獲取列舉型別StartStateEnum中的所有欄位值,並將返回的欄位值集合儲存在enumValues變數中。

然後,我們遍歷欄位值集合,並將每個欄位值輸出到控制檯。

請注意,我們定義了一個名為GetEnumValues的輔助方法,用於獲取列舉型別的欄位值。該方法使用反射來獲取欄位的值,並將其新增到集合中。我們還新增了一些驗證,以確保傳遞的型別是有效的列舉型別。

執行以上程式碼,輸出將是:

 1 Start 2 NotStart 

這證明成功將列舉型別StartStateEnum的欄位值新增到集合中並返回。請根據實際情況修改範例程式碼中的列舉型別和欄位處理邏輯。

實現:

  1.建立一個列舉幫助類,並加上上面的邏輯程式碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace Yuebon.Commons.Helpers
{
    /// <summary>
    /// 列舉幫助類
    /// </summary>
    public static class EnumHelper
    {
        /// <summary>
        /// 獲取列舉中所有欄位
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        /// <exception cref="ArgumentException"></exception>
        public static List<T> GetEnumValues<T>()
        {
            // 獲取列舉型別
            Type enumType = typeof(T);

            // 驗證是否為列舉型別
            if (!enumType.IsEnum)
            {
                throw new ArgumentNullException("指定的型別不是列舉。");
            }

            // 獲取列舉中的所有欄位
            FieldInfo[] fields = enumType.GetFields(BindingFlags.Public | BindingFlags.Static);

            // 儲存欄位值的集合
            List<T> enumValues = new List<T>();

            // 遍歷欄位並新增欄位值到集合
            foreach (var field in fields)
            {
                if (field.FieldType == enumType)
                {
                    T value = (T)field.GetValue(null);
                    enumValues.Add(value);
                }
            }

            return enumValues;
        }
    }
}

  2.呼叫和結果:

// GetDescription 獲取列舉描述的擴充套件方法,感興趣的小夥伴可以去看我之前的文章~
result.ResData = EnumHelper.GetEnumValues<StartStateEnum>().Select(d => new KeyValue { Key = Convert.ToInt32(d).ToString(), Value = d.GetDescription() });

 結尾:

  通過列舉將表中狀態已獲取下拉資料來源的形式響應給前端,程式碼可維護性和擴充套件性的優勢非常的明顯,也不必要去浪費資料庫的資源,是一個非常不錯的方法,當然了,一些變化比較多業務邏輯程式碼較少的一些欄位還是建議在字典中維護起來,如角色,型別等,

  因為最近工作比較忙,部落格比較少更新還請我為數不多的13位粉絲見諒哈哈哈,創作不易,如果對你有幫助不妨留下一顆免費的小紅星吧~