天天看點

.NET Enum枚舉公共類以及擷取所有枚舉項公共方法封裝

項目中枚舉是比較常用的一種類型,在功能開發的時候我們經常會擷取所有的枚舉項做一些邏輯判斷,以及将每個枚舉的所有枚舉項傳遞給UI或者API等。為了解決擷取枚舉的所有枚舉項,我們将枚舉封裝為枚舉類EnumNode,并擴充擷取所有枚舉項的擴充方法ToSelectList,詳細代碼如下:

------------------------------------------------------EnumNode枚舉項通用類---------------------------------------------------------

    /// <summary>

    /// 枚舉通用類

    /// </summary>

    public class EnumNode

    {

        /// <summary>

        /// Id

        /// </summary>

        public int Id { get; set; }

        /// <summary>

        /// 文本值

        /// </summary>

        public string Value { get; set; }

        /// <summary>

        /// 名稱

        /// </summary>

        public string Name { get; set; }

        /// <summary>

        /// 是否選中

        /// </summary>

        public bool Selected { get; set; }

    }

------------------------------------------------------EnumManager枚舉管理類---------------------------------------------------------

    /// <summary>

    /// 枚舉管理類

    /// </summary>

    public static class EnumManager

    {

        /// <summary>

        /// 擷取枚舉項清單

        /// </summary>

        /// <typeparam name="TEnum">枚舉類型</typeparam>

        /// <param name="enumObj">枚舉項</param>

        /// <param name="markCurrentAsSelected">是否選中目前枚舉項</param>

        /// <param name="valuesToExclude">不包含的枚舉項</param>

        /// <returns>通用枚舉清單</returns>

        public static IList<EnumNode> ToSelectList<TEnum>(this TEnum enumObj,

           bool markCurrentAsSelected = true, int[] valuesToExclude = null) where TEnum : struct

        {

            IList<EnumNode> values = new List<EnumNode>();

            if (!typeof(TEnum).IsEnum) throw new ArgumentException("An Enumeration type is required.", "enumObj");

            var enums = from TEnum enumValue in Enum.GetValues(typeof(TEnum))

                        where valuesToExclude == null || !valuesToExclude.Contains(Convert.ToInt32(enumValue))

                        select enumValue;

            foreach (var enumValue in enums)

            {

                var value = new EnumNode {

                    Id = Convert.ToInt32(enumValue),

                    Value = enumValue.ToString(),

                    Name = enumValue.ToString()

                };

                FieldInfo field = (typeof(TEnum)).GetField(enumValue.ToString());

                if (field != null) {

                    var attrs = field.GetCustomAttributes();

                    foreach (var attr in attrs)

                    {

                        var propertyName = attr.GetType().GetProperty("Name");

                        if (propertyName != null)

                        {

                            value.Name = propertyName.GetValue(attr).ToString();

                        }

                    }

                }

                if (markCurrentAsSelected && Convert.ToInt32(enumObj) == value.Id)

                {

                    value.Selected = true;

                }

                values.Add(value);

            }

            return values;

        }

    }

------------------------------------------------------項目調用---------------------------------------------------------

///前置代碼...

var orderStatusItems = OrderStatusEnum.Pending.ToSelectList();

///後置代碼...

擴充方法中我們通過反射來擷取的Enum的顯示名稱Name,該值從CustomAttribute屬性為Name的值擷取(如下示例代碼),CustomAttribute屬性可以直接使用常用的DisplayAttribute(System.ComponentModel.DataAnnotations)或者自己擴充的屬性,隻要屬性定義了Name成員即可被反射出來。

------------------------------------------------------枚舉示例定義代碼---------------------------------------------------------

    public enum OrderStatusEnum

    {

        [Display(Name = "待處理")]

        Pending = 10,

        [Display(Name = "已支付")]

        Paid = 20,,

    }

通過擴充方法我們可以直接擷取所有定義的枚舉的枚舉項清單,解決了項目中擷取所有枚舉項的問題。

希望對應枚舉的封裝對于大家幫助,如果有什麼問題或者回報,也歡迎大家提出來!

繼續閱讀