C# 枚舉類型 enum


我個人感覺平日用到的enum應該是非常簡單的,無非就是枚舉和整數、字符串之間的轉換。最近工作發現一些同事居然不太會用這個東東,於是就整理一下。

枚舉類型是定義了一組“符號名稱/值”配對。枚舉類型是強類型的。每個枚舉類型都是從system.Enum派生,又從system.ValueType派生,而system.ValueType又從system.Object派生,所以枚舉類型是值類型。編譯枚舉類型時,C#編譯器會把每個符號轉換成類型的一個常量字段。C#編譯器將枚舉類型視為基元類型。因為enum是值類型,而所有的值類型都是sealed,所以在擴展方法時都不能進行約束。但是,若要限制參數為值類型,可用struct 約束。因為enum一般用於一個字符串和整數值,如果我們需要關聯多個字符串的時候可以使用Description特性,如果枚舉彼此需要與或運算,需要借助Flags特性,enum里面定義的字符常量其整數值默認從0開始

看一下枚舉定義:

 public enum AwardType
    {
        /// <summary>
        ///1 積分
        /// </summary>
        [Description("積分")]
        Integral = 1,

        /// <summary>
        /// 2 充值卡
        /// </summary>
        [Description("充值卡")]
        RechargeCard = 2,

        /// <summary>
        /// 3 實物獎品
        /// </summary>
        [Description("實物獎品")]
        Gift = 3,
    }
    public static class Extend
    {
        public static string Description<T>(this T instance) where T : struct
        {
            string str = string.Empty;
            Type type = typeof(T);
            if (!typeof(T).IsEnum)
            {
                throw new ArgumentException("參數必須是枚舉類型");
            }
            var fieldInfo = type.GetField(instance.ToString());
            if (fieldInfo != null)
            {
                var attr = fieldInfo.GetCustomAttribute(typeof(DescriptionAttribute), false) as DescriptionAttribute;
                if (attr != null)
                {
                    str = attr.Description;
                }
                else
                {
                    str = fieldInfo.Name;
                }

            }
            return str;
        }

        public static T GetEnum<T>(this string description)
        {
            var fieldInfos = typeof(T).GetFields();
            foreach (FieldInfo field in fieldInfos)
            {
                DescriptionAttribute attr = field.GetCustomAttribute(typeof(DescriptionAttribute), false) as DescriptionAttribute;
                if (attr != null && attr.Description == description)
                {
                    return (T)field.GetValue(null);
                }
                else if (field.Name == description)
                {
                    return (T)field.GetValue(null);
                }
            }
            throw new ArgumentException(string.Format("{0} 未能找到對應的枚舉.", description), "Description");
        }
    }

編譯后如下:

在編碼的時候 必要的注釋 不能缺少,如下

/// <summary>
/// 3 實物獎品
/// </summary>

這樣VS在只能感知的時候就可以看到了。

而枚舉的應用也非常簡單:

  static void Main(string[] args)
        {
            //枚舉與整數轉換
            int giftInt = (int)AwardType.Gift;
            var a = (AwardType)giftInt;
            //枚舉與字符串轉換        
            string giftStr = AwardType.Gift.ToString();
            Enum.TryParse(giftStr, out AwardType b);
            ///檢測枚舉是否有效
            bool isdefine = Enum.IsDefined(typeof(AwardType), 1);
            ////獲取枚舉描述
            string str = AwardType.Gift.Description();
            ////通過描述獲取枚舉
            AwardType award = str.GetEnum<AwardType>();
            Console.ReadKey();
        }

這里枚舉和其描述信息是直接通過反射來實現的,為了性能提高可以采用字典緩存數據


免責聲明!

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



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