2013-10-07 57 views
2

所以,我有一個枚舉:創建對象的列表使用枚舉數據C#

public enum myEnum 
{ 
    IBM = 1, 
    HP = 2, 
    Lenovo = 3 
} 

我有一個Brand

public class Brand 
{ 
    public Brand(string name, int id) 
    { 
     Name = name; 
     Id = id; 
    } 

    public string Name { get; private set; } 
    public int Id { get; private set; } 
} 

我想創建填入數據Brand對象的列表從MyEnum。喜歡的東西:

private IEnumerable<Brand> brands = new List<Brand> 
{ 
    new Brand(myEnum.IBM.ToString(), (int) myEnum.IBM), 
    new Brand(myEnum.HP.ToString(), (int) myEnum.HP), 
    new Brand(myEnum.Lenovo.ToString(), (int) myEnum.Lenovo), 
}; 

我可以創建兩個數組 - 一個與枚舉名稱和其他與IDS枚舉和foreach他們創造每次迭代品牌對象,但不知道是否有更好的解決方案。

最後,我將與Royi Mindel解決方案一樣,根據我的說法,這是最合適的。非常感謝Daniel Hilgarth的回答以及Royi Mindel的建議。如果可以的話,我會把這兩個問題都歸功於他們。

public static class EnumHelper 
{ 
    public static IEnumerable<ValueName> GetItems<TEnum>() 
     where TEnum : struct, IConvertible, IComparable, IFormattable 
    { 
     if (!typeof(TEnum).IsEnum) 
      throw new ArgumentException("TEnum must be an Enumeration type"); 

     var res = from e in Enum.GetValues(typeof(TEnum)).Cast<TEnum>() 
        select new ValueName() { Id = Convert.ToInt32(e), Name = e.ToString() }; 

     return res; 
    } 
} 

public struct ValueName 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 
+0

我認爲這是一個最好的解決方案! –

+0

查看['Enum.GetNames()'](http://msdn.microsoft.com/en-us/library/system.enum.getnames.aspx)。 – CodeCaster

+3

只保留Brand類中的MyEnum,並創建一個返回enum.ToString()(如果需要)的屬性 –

回答

2

我建議做一般性ValueName的類適合所有枚舉和沒有做出具體的類,以滿足特定枚舉

public static class EnumHelper 
{ 
    public static IEnumerable<ValueName> GetItems<TEnum>() 
     where TEnum : struct, IConvertible, IComparable, IFormattable 
    { 
     if (!typeof(TEnum).IsEnum) 
      throw new ArgumentException("TEnum must be an Enumeration type"); 

     var res = from e in Enum.GetValues(typeof(TEnum)).Cast<TEnum>() 
        select new ValueName() { Value = Convert.ToInt32(e), Name = e.ToString()}; 

     return res; 
    } 

} 

public struct ValueName 
{ 
    public int Value { get; set; } 
    public string Name { get; set; } 
} 

那麼你只是做:

EnumHelper.GetItems<myEnum>() 
+0

我喜歡你的通用解決方案,但我需要Value屬性是int類型的,我無法強制轉換:select new ValueName(){Value =(int)e,Name = e.toString()}。 – Mdb

+0

try doing(int)(TEnum)e,讓我知道它是否工作 –

+0

它給出了錯誤 - 無法投入類型'System.Enum'的表達式來鍵入TEnum – Mdb

12
var brands = Enum.GetValues(typeof(myEnum)) 
       .Cast<myEnum>() 
       .Select(x => new Brand(x.ToString(), (int)x)) 
       .ToArray(); 
+4

鼓勵downvoter發表評論,以便我可以解決您認爲不正確的問題。提示:我測試了這段代碼,它可以正常工作 –

2

你的代碼非常好,但是我的代碼更改了位級簡化。

Enum類(不改變):

public enum myEnum 
{ 
    IBM = 1, 
    HP = 2, 
    Lenovo = 3 
} 

品牌類(修改參數的長度,你可以通過枚舉的一個參數):

public class Brand 
{ 
    public Brand(Enum Data) 
    { 
     Name = Data.ToString(); 
     Id = Convert.ToInt32(Data); 
    } 

    public string Name { get; private set; } 
    public int Id { get; private set; } 
} 

這裏是改變這種方式:

private IEnumerable<Brand> brands = new List<Brand> 
{ 
    new Brand(myEnum.IBM), 
    new Brand(myEnum.HP), 
    new Brand(myEnum.Lenovo), 
}; 

而你喜歡看這個樣本:C# Iterating through an enum? (Indexing a System.Array)

+3

謝謝你的回答,Ramesh!我相信用我的方式Brand類接口和用法更清晰 - 它接受名稱和id並初始化相應的屬性。 – Mdb