C#将枚举视为数组

时间:2013-08-08 09:46:18

标签: c# arrays enums

在我的项目中,我有一个enum,其中我存储了音乐流派的值,如下所示:

enum Genres { Rock,Pop,Disco,Sport,Talk,Metal,Hard_Rock,Electro,Classic_Rock}

现在在我的代码中我想要一个foreach循环,它将根据音乐类型做一些工作。这样的事情:

foreach(Genres genre in Enum.GetValues(typeof(Genres)))
{
     switch(genre)
     {
         case Genres.Disco:
                 //Do Something
              break;
             case Genres.Rock:
                 //Do Something
              break;
         .....
         .......
     }
}

我想要做的是将enum案例中的switch视为数组。这样的事情:

foreach(Genres genre in Enum.GetValues(typeof(Genres)))
{
     switch(genre)
     {
         case Genres[0]:
                 //Do Something
              break;
             case Genres[1]:
                 //Do Something
              break;
         .....
         .......
     }
}

这可能吗?提前谢谢。

EDIT

我有一个ListBox,我想用GenreItems填充它。但是对于每个ListBoxItem,我想要一个不同的名称屁股我传递它们。所以我做这个开关以检查类型和案例是Rock例如我将ListBoxItem设置为ROCK并将其添加到ListBox中。

3 个答案:

答案 0 :(得分:2)

除非你做一些调整,否则我认为这是不可能的......例如,使用静态数组存储所有值:

public static readonly Genres[] AllGenres = Enum.GetValues(typeof(Genres)).Cast<Genres>().ToArray();

// sample:
public void test()
{
   var first = AllGenres [0];
}

修改

现在我明白了你的需要。你真的想要一个列表绑定到一个控件。如果您认为只需要描述,我想您可能想尝试使用属性到枚举,然后编写一个通用方法来检索枚举项并将其包装为对象,如:

public enum Genres
{
    [Description("Rock!!!")]
    Rock, 
    Pop, 
    Disco, 
    Sport, 
    Talk, 
    Metal, 
    Hard_Rock, 
    Electro, 
    [Description("Classic Rock")]
    Classic_Rock
}

public class EnumItem
{
    string Name { get; set; }
    string Description { get; set; }
    Enum EnumValue {get;set;}

    public static IEnumerable<EnumItem> GetValue(Type t)
    {
        // implementation using reflection/expression            
    }
}

// then you can use the retrieved list/whatever to do binding or so...

你可以进一步调整它以满足你的需求(例如,使用类型约束使其更好) - 更重要的是,这将成为服务所有枚举类型的通用类......

答案 1 :(得分:1)

根据您的编辑,它看​​起来像你想要的

foreach(var genre in Enum.GetNames(typeof(Genres)))
{
     listBox.Items.Add(genre.ToUpperInvariant());
}

答案 2 :(得分:0)

你试图这样做吗?

                foreach(Genres genre in Enum.GetValues(typeof(Genres)))
                {
                    switch (genre)
                    {
                        case Genres.Classic_Rock:
                            //your code
                            break;
                        case Genres.Disco:
                            //your code
                            break;
                        default:
                            //your code
                            break;
                    }
                }