C# enum 列舉 同時儲存內容值和中文說明 教學

在使用列舉(enum)時,成員名稱可能不容易完整描述所代表的意思,又或是需要將列舉對應到其他中文說明顯示給使用者看,這時候通常就很麻煩的需要用一堆 if 或是 switch 判斷是哪一個列舉,然後才能將對應的文字顯示出來。

假設某家飲料店的冰塊份量可以分為:去冰、微冰、少冰、正常冰、多冰
一般的列舉如下:
    
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

留言