0

在我的项目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 中。

4

3 回答 3

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...

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

于 2013-08-08T09:56:17.347 回答
1

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

foreach(var genre in Enum.GetNames(typeof(Genres)))
{
     listBox.Items.Add(genre.ToUpperInvariant());
}
于 2013-08-08T10:02:59.673 回答
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;
                    }
                }
于 2013-08-08T09:56:01.227 回答