在使用列舉(enum)時,成員名稱可能不容易完整描述所代表的意思,又或是需要將列舉對應到其他中文說明顯示給使用者看,這時候通常就很麻煩的需要用一堆 if 或是 switch 判斷是哪一個列舉,然後才能將對應的文字顯示出來。
假設某家飲料店的冰塊份量可以分為:去冰、微冰、少冰、正常冰、多冰
一般的列舉如下:
如果要輸出是哪種冰量的中文就需要很醜的轉換後才能顯示:
其實有一個方法很簡單,就是使用 Description 屬性(Attribute)儲存內容,使用反映(Reflection)(反射)讀取屬性的參數,並撰寫擴充方法(Extension Method) 方便呼叫。
好像很複雜... 其實很簡單,直接看範例最快!
將列舉使用 Description 屬性增加中文說明
撰寫擴充方法 (檔名: EnumExtenstion.cs)
要顯示時只要呼叫擴充方法:
重點就是在剛剛寫的這個 GetDescription 擴充方法,讓我們能夠很方便的拿到 Description 的參數,直接轉換為中文,是不是非常方便!
參考資料:
屬性(Attribute)
反映(Reflection)
擴充方法(Extension Method)
DescriptionAttribute
MemberInfo
假設某家飲料店的冰塊份量可以分為:去冰、微冰、少冰、正常冰、多冰
一般的列舉如下:
public enum IceLevel
{
None, // 去冰
Little, // 微冰
Less, // 少冰
Normal, // 正常冰
More, // 多冰
}
如果要輸出是哪種冰量的中文就需要很醜的轉換後才能顯示:
IceLevel iceLevel = IceLevel.None;
string str = iceLevel switch
{
IceLevel.None => "去冰",
IceLevel.Little => "微冰",
IceLevel.Less => "少冰",
IceLevel.Normal => "正常冰",
IceLevel.More => "多冰",
_ => "未知"
};
Console.WriteLine($"冰量是: {str}"); // 冰量是: 去冰
其實有一個方法很簡單,就是使用 Description 屬性(Attribute)儲存內容,使用反映(Reflection)(反射)讀取屬性的參數,並撰寫擴充方法(Extension Method) 方便呼叫。
好像很複雜... 其實很簡單,直接看範例最快!
將列舉使用 Description 屬性增加中文說明
public enum IceLevel
{
[Description("去冰")] None,
[Description("微冰")] Little,
[Description("少冰")] Less,
[Description("正常冰")] Normal,
[Description("多冰")] More,
}
撰寫擴充方法 (檔名: EnumExtenstion.cs)
/// <summary>
/// 列舉的擴充方法
/// </summary>
public static class EnumExtenstion
{
/// <summary>
/// 回傳 Enum 的 Description 屬性,如果沒有 Description 屬性就回傳列舉成員名稱
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public static string GetDescription(this Enum value)
{
var field = value.GetType().GetField(value.ToString());
var attribute = field?.GetCustomAttributes(typeof(DescriptionAttribute), false).FirstOrDefault() as DescriptionAttribute;
return attribute == null ? value.ToString() : attribute.Description;
}
}
要顯示時只要呼叫擴充方法:
IceLevel iceLevel = IceLevel.None;
Console.WriteLine($"冰量是: {iceLevel.GetDescription()}"); // 冰量是: 去冰
重點就是在剛剛寫的這個 GetDescription 擴充方法,讓我們能夠很方便的拿到 Description 的參數,直接轉換為中文,是不是非常方便!
參考資料:
屬性(Attribute)
反映(Reflection)
擴充方法(Extension Method)
DescriptionAttribute
MemberInfo
留言
張貼留言
如果有任何問題、建議、想說的話或文章題目推薦,都歡迎留言或來信: a@ruyut.com