using System; using System.ComponentModel; using System.Reflection; namespace Common { /**//// <summary> /// 枚舉幫助類 /// </summary> public static class EnumHelper { private static DescriptionAttribute[] GetDescriptAttr(this FieldInfo fieldInfo) { if (fieldInfo != null) { return (DescriptionAttribute[])fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false); } return null; } /**//// <summary> ///判斷枚舉是否包括枚舉常數名稱 /// </summary> /// <typeparam name="T">枚舉</typeparam> /// <param name="enumName">枚舉常數名稱</param> /// <returns>是否包括枚舉常數名稱</returns> public static bool CheckedContainEnumName<T>(string enumName) where T : struct, IConvertible { bool _result = false; if (typeof(T).IsEnum) { string[] _enumnName = Enum.GetNames(typeof(T)); if (_enumnName != null) { for (int i = 0; i < _enumnName.Length; i++) { if (string.Compare(_enumnName[i], enumName, true) == 0) { _result = true; break; } } } } return _result; } /**//// <summary> /// 從枚舉中獲取Description /// </summary> /// <param name="targetEnum">須要獲取枚舉描述的枚舉</param> /// <returns>描述內容</returns> public static string GetDescription(this Enum targetEnum) { string _description = string.Empty; FieldInfo _fieldInfo = targetEnum.GetType().GetField(targetEnum.ToString()); DescriptionAttribute[] _attributes = _fieldInfo.GetDescriptAttr(); if (_attributes != null && _attributes.Length > 0) _description = _attributes[0].Description; else _description = targetEnum.ToString(); return _description; } /**//// <summary> /// 根據Description獲取枚舉 /// </summary> /// <typeparam name="T">枚舉類型</typeparam> /// <param name="description">枚舉描述</param> /// <returns>枚舉</returns> public static T ParseEnumDescription<T>(this string description, T defaultValue) where T : struct, IConvertible { if (typeof(T).IsEnum) { Type _type = typeof(T); foreach (FieldInfo field in _type.GetFields()) { DescriptionAttribute[] _description = field.GetDescriptAttr(); if (_description != null && _description.Length > 0) { if (string.Compare(_description[0].Description, description, true) == 0) { defaultValue = (T)field.GetValue(null); break; } } else { if (string.Compare(field.Name, description, true) == 0) { defaultValue = (T)field.GetValue(null); break; } } } } return defaultValue; } /**//// <summary> /// 將枚舉常數名稱轉換成枚舉 /// </summary> /// <typeparam name="T">枚舉</typeparam> /// <param name="enumName">枚舉常數名稱</param> /// <returns></returns> public static T ParseEnumName<T>(this string enumName) where T : struct, IConvertible { return (T)Enum.Parse(typeof(T), enumName, true); } } }
調用實例html
public enum AreaMode { NONE, CITY, TOWN, ROAD, CITYTOWN, TOWNROAD, CITYROAD, ALL } public class EnumHelperTests { public void CheckedContainEnumNameTest() { EnumHelper.CheckedContainEnumName<AreaMode>("none"); } public void GetDescriptionTest() { AreaMode.NONE.GetDescription(); } public void ParseEnumDescriptionTest() { EnumHelper.ParseEnumDescription<AreaMode>("NONE", AreaMode.CITYTOWN); } public void ParseEnumNameTest() { EnumHelper.ParseEnumName<AreaMode>("ALL"); } }
參考資料:介紹一個.NET枚舉共用類 http://www.studyofnet.com/news/1129.htmlc#