C#中枚舉的使用


枚舉大家都不陌生,但是最近看到有的人,還在是頁面上寫死,如果枚舉增減時,還要去頁面去手動修改,今天我們來看看枚舉的處理方式,這里說一下,我用的測試程序是.net core 3.1。

不多墨跡,直接上代碼:

定義枚舉:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;

namespace ConsoleApp1
{
    public enum Status
    {
        [Description("已刪除")]
        Deleted = -1,

        [Description("未處理")]
        Init = 0,

        [Description("正常")]
        Normal = 1
    }
}

枚舉的輔助類,這里說明一下,我是通過獲取枚舉上的特性來處理的:

EnumUtil.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Reflection;
using System.Runtime.Serialization;
using System.Text;

namespace ConsoleApp1
{
    public static class EnumUtil
    {
        /// <summary>
        /// 獲取枚舉的描述
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public static string GetDesc(Enum obj)
        {
            string objName = obj.ToString();
            Type t = obj.GetType();
            FieldInfo fi = t.GetField(objName);
            if (fi == null)
                return objName;
            DescriptionAttribute[] arrDesc = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);
            if (arrDesc.Length > 0)
                return arrDesc[0].Description;
            else
                return objName;
        }
        /// <summary>
        /// 獲取枚舉的鍵值對集合
        /// </summary>
        /// <param name="e"></param>
        /// <returns></returns>
        public static Dictionary<int, string> GetEnumIntNameDict(Enum e)
        {
            return GetEnumNameValueDict(e, (Object o) => { return Convert.ToInt32(o); });
        }
        public static Dictionary<TOutput, string> GetEnumNameValueDict<TOutput>(Enum e, Converter<Object, TOutput> convert)
        {
            Type enumType = e.GetType();
            if (!enumType.IsEnum)
            {
                throw new ArgumentException("參數必須是枚舉類型", "enumType");
            }

            FieldInfo[] fields = enumType.GetFields();

            if (fields != null)
            {
                Dictionary<TOutput, string> dict = new Dictionary<TOutput, string>();

                foreach (FieldInfo f in fields)
                {
                    if (f.Name.EndsWith("__")) continue;

                    DescriptionAttribute[] attrs = (DescriptionAttribute[])f.GetCustomAttributes(typeof(DescriptionAttribute), false);
                    string name = f.Name;
                    if (attrs != null && attrs.Length == 1)
                    {
                        name = attrs[0].Description;
                    }
                    TOutput val = convert(f.GetValue(e));
                    dict.Add(val, name);
                }
                return dict;
            }

            return null;
        }
        /// <summary>
        /// 獲取枚舉的鍵值對集合
        /// </summary>
        /// <param name="e"></param>
        /// <returns></returns>
        public static Dictionary<string, string> GetEnumVarNameDict(Enum e)
        {
            Type enumType = e.GetType();
            if (!enumType.IsEnum)
            {
                throw new ArgumentException("參數必須是枚舉類型", "enumType");
            }

            FieldInfo[] fields = enumType.GetFields();

            if (fields != null)
            {
                Dictionary<string, string> dict = new Dictionary<string, string>();

                foreach (FieldInfo f in fields)
                {
                    if (f.Name.EndsWith("__")) continue;

                    DescriptionAttribute[] attrs = (DescriptionAttribute[])f.GetCustomAttributes(typeof(DescriptionAttribute), false);
                    string name = f.Name;
                    if (attrs != null && attrs.Length == 1)
                    {
                        name = attrs[0].Description;
                    }
                    dict.Add(f.Name, name);
                }
                return dict;
            }

            return null;
        }

        private static SortedList<Enum, string> enumDesciptionDict = new SortedList<Enum, string>();
        /// <summary>
        /// 獲取枚舉的描述
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        public static string GetDescription(this Enum value)
        {
            string description = string.Empty;
            if (enumDesciptionDict.TryGetValue(value, out description)) return description;

            FieldInfo field = value.GetType().GetField(value.ToString());
            DescriptionAttribute attribute = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute;
            if (attribute == null)
                enumDesciptionDict[value] = value.ToString();
            else
                enumDesciptionDict[value] = attribute.Description;
            return enumDesciptionDict[value];
        }
        /// <summary>
        /// 獲取特性
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        public static DescriptionAttribute GetAttribute(this Enum value)
        {
            FieldInfo field = value.GetType().GetField(value.ToString());
            return Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute;
        }
    }
}

定義一個調用類,當然你也可以直接調用:

CommonEnumsDict.cs

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApp1
{
    public class CommonEnumsDict
    {

        public static readonly Dictionary<int, string> StatusDict;
        public static readonly Dictionary<string, string> StatusStrDict;
        static CommonEnumsDict()
        {
            StatusDict = EnumUtil.GetEnumIntNameDict(Status.Normal);
            StatusStrDict = EnumUtil.GetEnumVarNameDict(Status.Normal);
        }
    }
}

最后調用:

Program.cs

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            foreach (var item in CommonEnumsDict.StatusDict)
            {
                Console.WriteLine("key:" + item.Key + ",value:" + item.Value);
            }
            Console.WriteLine("--------------------------");
            var PayValues = Enum.GetValues(typeof(Status));
            foreach (var v in PayValues)
            {
                var name = EnumUtil.GetDesc((Status)v);
                Console.WriteLine("key:" + (int)v + ",value:" + name);

            }
            Console.WriteLine("--------------------------");
            foreach (var item in CommonEnumsDict.StatusStrDict)
            {
                Console.WriteLine("key:" + item.Key + ",value:" + item.Value);
            }
            var del = Status.Deleted.GetAttribute();
            Console.WriteLine("del:" + del.Description);
            Console.ReadLine();
        }
    }
}

結果:

key:-1,value:已刪除
key:0,value:未處理
key:1,value:正常
--------------------------
key:0,value:未處理
key:1,value:正常
key:-1,value:已刪除
--------------------------
key:Deleted,value:已刪除
key:Init,value:未處理
key:Normal,value:正常
del:已刪除

你最喜歡的代碼:點擊下載


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM