筆者很常使用列舉(enum),列舉最大的缺點就是不能儲存中文或是任何字串,在 C# enum 列舉 同時儲存內容值和中文說明教學 這篇文章中筆者有示範使用反射(Reflection)(反映)讓 enum 同時儲存中文
除了上面的方式以外還有一個選擇,就是本文要示範的方式,使用靜態類別,裡面放常數就可以了,如果想要像列舉一樣可以使用歷遍,透過反射(Reflection)也能輕易達成
有點不太明白,沒關係來看範例就知道了
例如上面的列舉可以換成下面這樣的方式
要輸出的時候可以直接使用:
在 C# 把列舉列舉出來 (enum) 這篇文章中也有說明到可以使用 foreach 的方式歷遍 enum,那我們現在使用 const 後有辦法嗎?
當然可以,就是使用反射(Reflection)!
先寫一個擴充方法
列出類別中所有變數的字串:
那如果要變數的名稱呢?就是在程式中呼叫時的那個英文
當然沒問題!只要再寫一個擴充方法
列出類別中所有變數名稱:
是不是非常方便?
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
是不是非常方便?
留言
張貼留言
如果有任何問題、建議、想說的話或文章題目推薦,都歡迎留言或來信: a@ruyut.com