通常我們需要定義一組特定值棋傍。采用枚舉再好不過了。它可以讓我們很方便直觀的管理一組固定的值。如果我們需要對應輸出枚舉值的漢語意思或者顏色樣式等,我們可以這樣實現(xiàn):
首先定義一個枚舉類
enum @enum
{
Update = 1,
Insert = 2
}
方式一(if語句)
if (@enum == 1)
{
Console.Write("更新");
}
else (@enum == 2){
Console.Write("新增");
}
方式二(switch語句)
switch(@enum)
{
case 1:
Console.Write("更新");
break;
case 2:
Console.Write("新增");
break;
}
方式三(采用字典)
Dictionary<int, string> dic = new Dictionary<int, string>
{
[1] = "更新",
[2] = "新增"
};
Console.Write(dic[@enum]);
現(xiàn)在我們用一種更加優(yōu)雅的方式來實現(xiàn)屑彻,給枚舉加特性
在System.ComponentModel命名空間下有一個特性Description,用來指定屬性或事件的描述顶吮。
enum @enum
{
[Description("修改")]
Update = 1,
[Description("新增")]
Insert = 2
}
我們可以寫一個擴展社牲,用來獲取Description特性,這用反射來讀取Description的值云矫,這個是復用性的
/// <summary>
/// 獲取特性 (DescriptionAttribute) 的說明膳沽;如果未使用該特性,則返回枚舉的名稱让禀。可指定的默認值陨界。
/// </summary>
/// <param name="enum"></param>
/// <param name="def">默認值</param>
/// <returns></returns>
public static string Description(this Enum @enum, string def = "")
{
Type enumType = @enum.GetType();
int value = int.Parse(Enum.Format(enumType, Enum.Parse(enumType, @enum.ToString()), "d"));
FieldInfo fieldInfo = enumType.GetField(Enum.GetName(enumType, value));
if (fieldInfo.GetCustomAttribute(typeof(DescriptionAttribute), false) is DescriptionAttribute descriptionAttribute)
{
return descriptionAttribute.Description;
}
return def != "" ? def : @enum.ToString();
}
那么在使用的時候我們將可以很方便的獲取枚舉值對應的描述信息
@enum.Update.Description();
這樣每次使用都只需要這一句代碼便可調出枚舉值的描述信息那么巡揍,如果還有其它需求怎么辦,比方說菌瘪,這個枚舉值還需要有代表色腮敌,樣式等用來渲染HTML的屬性怎么辦阱当,這里就用到了自定義特性,我們先說說怎么自定義特性糜工。其實很簡單弊添。
新建一個類,注意所有的特性類必須繼承自 Attribute捌木,代碼如下:
/// <summary>
/// 指定屬性的樣式
/// </summary>
public class ClassAttribute : Attribute
{
/// <summary>
/// 值
/// </summary>
public string Value{ get; set; }
/// <summary>
/// 設置值
/// </summary>
/// <param name="value"></param>
public ClassAttribute(string value) => Value = value;
}
這樣一個自定義特性就建好了油坝,那么調用的方法,和Description一樣刨裆。但是如果每次添加一個自定義特性都得建立一個調取特性值的方法澈圈,是不是很累。我們要記住面向對象的三大特性之封裝帆啃。我們再寫一個擴展瞬女,這里用到了反射和泛型。
/// <summary>
/// 獲取指定特性的值
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="enum"></param>
/// <param name="def">默認值</param>
/// <returns></returns>
public static String GetAttribute<T>(this Enum @enum, String def = "") where T : Attribute
{
object[] attributes = @enum.GetType().GetMember(@enum.ToString())[0].GetCustomAttributes(typeof(T), false);
return attributes.Length > 0 ? attributes[0].PropertyValue("Value") : def;
}
我們需要更改一下枚舉
enum @enum
{
[Description("修改"),Class("className")]
Update = 1,
[Description("新增"),Class("className")]
Insert = 2
}
在使用的時候我們將可以很方便的獲取到自定義特性的值
@enum.Update.GetAttribute<ClassAttribute>();
使用的時候注意引用關系努潘。使用的時候根據(jù)實際需求做相應的調整诽偷。