C# 列舉(enum)不能儲存字串?!那我們用反射自己做一個

筆者很常使用列舉(enum),列舉最大的缺點就是不能儲存中文或是任何字串,在 C# enum 列舉 同時儲存內容值和中文說明教學 這篇文章中筆者有示範使用反射(Reflection)(反映)讓 enum 同時儲存中文
    
public enum IceLevel
{
    [Description("去冰")] None,
    [Description("微冰")] Little,
    [Description("少冰")] Less,
    [Description("正常冰")] Normal,
    [Description("多冰")] More,
}
    

除了上面的方式以外還有一個選擇,就是本文要示範的方式,使用靜態類別,裡面放常數就可以了,如果想要像列舉一樣可以使用歷遍,透過反射(Reflection)也能輕易達成

有點不太明白,沒關係來看範例就知道了

例如上面的列舉可以換成下面這樣的方式
    
public static class IceLevel
{
    public const string None = "去冰";
    public const string Little = "微冰";
    public const string Less = "少冰";
    public const string Normal = "正常冰";
    public const string More = "多冰";
}
    

要輸出的時候可以直接使用:
    
Console.WriteLine(IceLevel.None);
// 去冰
    

C# 把列舉列舉出來 (enum) 這篇文章中也有說明到可以使用 foreach 的方式歷遍 enum,那我們現在使用 const 後有辦法嗎?
當然可以,就是使用反射(Reflection)!

先寫一個擴充方法
    
public static class CustomizedEnumHelper
{
    public static IEnumerable<string> GetAllValues(this Type type)
    {
        FieldInfo[] fields = type.GetFields(BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy);
        return fields
            .Select(field => field.GetValue(null)?.ToString() ?? "")
            .Where(value => !string.IsNullOrEmpty(value));
    }
}
    

列出類別中所有變數的字串:
    
var iceLevels = typeof(IceLevel).GetAllValues();
foreach (var iceLevel in iceLevels)
{
    Console.WriteLine(iceLevel);
}

// 去冰
// 微冰
// 少冰
// 正常冰
// 多冰
    

那如果要變數的名稱呢?就是在程式中呼叫時的那個英文
當然沒問題!只要再寫一個擴充方法
    
public static class CustomizedEnumHelper
{
    public static IEnumerable<string> GetAllMember(this Type type)
    {
        FieldInfo[] fields = type.GetFields(BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy);

        return fields
            .Select(field => field.Name)
            .Where(value => !string.IsNullOrEmpty(value));
    }
}

    

列出類別中所有變數名稱:
    
foreach (var item in typeof(IceLevel).GetAllMember())
{
    Console.WriteLine(item);
}

// None
// Little
// Less
// Normal
// More

    

是不是非常方便?

留言