眾所皆知,在程式中遇到魔術數字是很擾人的,不但降低可讀性,除錯時也增加困擾,所以通常是建議使用一些增加可讀性的方式去取代,例如使用列舉型別(Enumeration)去將這些魔術數字轉變成比較好讀的形式,但是列舉預設只能塞int,雖然可以直接把列舉名稱toString拿來用,但是如果要有特殊符號(如空白)就沒辦法了。
在這時候,我們可以利用Description的屬性去把我們想要的資訊塞進去。
先貼 code 再解釋
在這個範例內,我設了一個 enum 叫做 Urban,裡面定義了若干資料,然後做了一些Demo。

首先,我利用EnumToList這function把enum轉成IEnumerable,這樣才能用foreach把全部資料都拉出來。
然後我展示了enum間的比較,前面說過列舉原則上只能塞數字進去,所以Urban.L33T>Urban.Uber的比較其實就是 -1>1 ,結果當然會是False。
下一行是展示一下如何取得Description,雖然前面foreach內就有用過了。
最後是顯示一下enum的value是如何運作,enum不指值的話,預設是從0按順序加上去,所以Vrse從前值繼續往上加就是2。
簡單來說就是如此,試過就知道,其實這是個很方便的東西。
參考 : Associating Strings with enums in C#
public enum Country
{
Afghanistan,
Albania,
Algeria,
Andorra,
Angola,
AntiguaAndBarbuda,//Antigua and Barbuda
Argentina
}
在這時候,我們可以利用Description的屬性去把我們想要的資訊塞進去。
先貼 code 再解釋
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Globalization;
using System.Linq;
using System.Reflection;
namespace Test
{
class Program
{
static void Main()
{
foreach (var u in EnumToList<Urban>())
{
Console.WriteLine(u + " = " + (int)u + " ,description = " + GetEnumDescription(u));
}
Console.WriteLine();
Console.WriteLine(Urban.L33T + ">" + Urban.Uber + " ? " + (Urban.L33T > Urban.Uber));
Console.WriteLine(Urban.Yolo+"'s description = "+ GetEnumDescription((Urban.Yolo)));
Console.WriteLine(Urban.Vsre+"'s value = "+(int)Urban.Vsre);
Console.ReadLine();
}
public static string GetEnumDescription(Enum value)
{
FieldInfo fi = value.GetType().GetField(value.ToString());
var attributes = (DescriptionAttribute[]) fi.GetCustomAttributes(typeof (DescriptionAttribute), false);
return attributes.Length > 0 ? attributes[0].Description : value.ToString();
}
public static IEnumerable<T> EnumToList<T>()
{
Type enumType = typeof(T);
if (enumType.BaseType != typeof(Enum))
throw new ArgumentException("T must be of type System.Enum");
Array enumValArray = Enum.GetValues(enumType);
var enumValList = new List<T>(enumValArray.Length);
enumValList.AddRange(from int val in enumValArray select (T) Enum.Parse(enumType, val.ToString(CultureInfo.InvariantCulture)));
return enumValList;
}
}
public enum Urban
{
/// <summary>
/// l33t
/// </summary>
[Description("elite")]
L33T = -1,
/// <summary>
/// Über
/// </summary>
[Description("The ultimate, above all, the best, top, something that nothing is better than")]
Uber = 1,
/// <summary>
/// VSRE
/// </summary>
[Description("very short reply expected.")]
Vsre,
/// <summary>
/// YOLO
/// </summary>
[Description("you only live once")]
Yolo = 11
}
}在這個範例內,我設了一個 enum 叫做 Urban,裡面定義了若干資料,然後做了一些Demo。

首先,我利用EnumToList這function把enum轉成IEnumerable,這樣才能用foreach把全部資料都拉出來。
然後我展示了enum間的比較,前面說過列舉原則上只能塞數字進去,所以Urban.L33T>Urban.Uber的比較其實就是 -1>1 ,結果當然會是False。
下一行是展示一下如何取得Description,雖然前面foreach內就有用過了。
最後是顯示一下enum的value是如何運作,enum不指值的話,預設是從0按順序加上去,所以Vrse從前值繼續往上加就是2。
簡單來說就是如此,試過就知道,其實這是個很方便的東西。
參考 : Associating Strings with enums in C#

No comments:
Post a Comment