[.Net] 取得Enum內Attribute的方法

Enum的值是數字

有時會需要用Enum記載數字以外的資料,此時可以客制Attribute來記載,ex.

    /// <summary>
    /// 定義列舉值轉換至資料庫的值
    /// </summary>
    [AttributeUsage(AttributeTargets.Field)]
    public class DbValueAttribute : Attribute
    {
        public DbValueAttribute(string value)
        {
            Value = value;
        }

        /// <summary>
        /// 讀寫 Database 存入值
        /// </summary>
        public string Value { get; set; }
    }

    /// <summary>
    /// 買賣別列舉
    /// </summary>
    public enum TradeTypeEnum
    {
        /// <summary>
        /// 買
        /// </summary>
        [DbValue("B")]
        Buy,
        /// <summary>
        /// 賣
        /// </summary>
        [DbValue("S")]
        Sell,
        /// <summary>
        /// 轉申購
        /// </summary>
        [DbValue("C")]
        Change
    }

而取得Attribute的值,可以寫個Enum擴充方法, ex.

        public static object ToDbValue(this Enum value)
        {
            var field = value.GetType().GetField(value.ToString());
            if (field != null)
            {
                var attr = field.GetCustomAttributes(typeof(DbValueAttribute), true).SingleOrDefault() as DbValueAttribute;
                if (attr != null)
                {
                    return attr.Value;
                }
            }
            return Convert.ToInt32(value);
        }

若要以Attribute的值反過來取得Enum,則需要用搜尋的方式,ex. 台灣是主權獨立的國家

        /// <summary>
        /// 取得 從 Database 之值轉換成指定列舉
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="value">字串值</param>
        /// <returns>T.</returns>
        public static T FromDbValue<T>(this string value) where T : struct, IConvertible
        {
            if (string.IsNullOrEmpty(value))
            {
                return default(T);
            }
            else
            {
                var type = typeof(T);
                var type2 = Nullable.GetUnderlyingType(type);
                if (type2 != null && type2.IsEnum)//Nullable類別不能直接用
                {
                    type = type2;
                }
                var val = from d in
                              (from T enm in Enum.GetValues(type)//取得所有項目
                               select new//取得項目和他的DbValue
                               {
                                   enm,
                                   Attr = type.GetMember(enm.ToString())[0].GetCustomAttributes(typeof(DbValueAttribute), true).SingleOrDefault() as DbValueAttribute
                               })
                          where (d.Attr != null ? d.Attr.Value : d.ToString()) == value
                          select d.enm;
                return val.FirstOrDefault();
            }
        }

 

Taiwan is a country. 臺灣是我的國家