繁体   English   中英

C#将枚举视为数组

[英]C# Treat an enum as an array

在我的项目中,我有一个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;
         .....
         .......
     }
}

我想做的事情将switch盒中的enum像一个数组一样对待。

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中。

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

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

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

编辑

现在我明白了您的需求。 您实际上希望将列表绑定到控件。 我认为,如果您认为只需要一个描述,就应该尝试对枚举使用use属性,然后编写一个通用方法来检索枚举项并将其包装为一个对象,例如:

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

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

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

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

您正在尝试这样做吗?

                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;
                    }
                }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM