把 enum 型別的所有列舉常數轉換成一個陣列或字典

範例:把 enum 型別轉換成一個陣列,該陣列的每一個元素即為列舉常數的名稱與值。

想跳過囉嗦的文字說明,可直接到 .NET Fiddle 上面查看並測試這些範例程式

有時候,一些基本的代碼表沒有特別建立在資料庫裡,而是在程式中使用一個自訂的 enum 型別。比如說,假設我們為「會員類型」定義了如下的 enum 型別:

    public enum MembershipType
    {
        General,
        Silver,
        Golden
    }

在某些場合,例如使用一個下拉清單(dropdown list)來顯示所有會員類型的時候,此時會需要取得所有會員類型的顯示名稱與對應的數值。我們可以定義一個類別來代表每一個列舉常數的內容(名稱與值)。

    public class MembershipTypeInfo
    {
        public MembershipType Id { get; set; }
        public string Name { get; set; }
    }

底下這個函式可以將先前的 MembershipType 中定義的每一個列舉常數轉成 MembershipTypeInfo 陣列:

public static MembershipTypeInfo[] GetMembershipTypes_HardedCoded()
{
    return new[]
    {
        new MembershipTypeInfo() { Id = MembershipType.General, Name = MembershipType.General.ToString() },
        new MembershipTypeInfo() { Id = MembershipType.Silver, Name = MembershipType.Silver.ToString() },
        new MembershipTypeInfo() { Id = MembershipType.Golden, Name = MembershipType.Golden.ToString() },
    };
}

可是如果將來 MembershipType 內容有變動時,例如增加一個叫做 Bronze 的會員類型,此時就得修改這個 GetMembershipTypes 方法。考慮到這點,則以下寫法比較好:

public static MembershipTypeInfo[] GetMembershipTypes_Better()
{
    var values = Enum.GetValues(typeof(MembershipType)).Cast<MembershipType>().ToArray();

    var query = from value in values
                select new MembershipTypeInfo
                {
                    Id = value,
                    Name = value.ToString()
                };
    return query.ToArray();
}

如果想要省掉 MembershipTypeInfo,改用泛型 Dictionary<int, string=""> 來取代,則可以寫成:

public static Dictionary<int, string> GetMembershipTypes_Dictionary()
{
    var values = Enum.GetValues(typeof(MembershipType)).Cast<MembershipType>().ToArray();
    var query = from value in values
                select new
                {
                    Id = (int)value,
                    Name = value.ToString()
                };
    return query.ToDictionary(x => x.Id, x => x.Name);
}

前往 .NET Fiddle 查看並測試這些範例程式

沒有留言:

技術提供:Blogger.
回頂端⬆️