項目中枚舉是比較常用的一種類型,在功能開發的時候我們經常會擷取所有的枚舉項做一些邏輯判斷,以及将每個枚舉的所有枚舉項傳遞給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,,
}
通過擴充方法我們可以直接擷取所有定義的枚舉的枚舉項清單,解決了項目中擷取所有枚舉項的問題。
希望對應枚舉的封裝對于大家幫助,如果有什麼問題或者回報,也歡迎大家提出來!