确实遍历各种枚举的函数

时间:2019-01-02 04:09:14

标签: c# enums enumeration

例如,让我们成为枚举并让我们循环遍历

enum Main_menu { NewGame, Options, AboutAuthor, Exit }
    static void Main(string[] args)
    {

        int k = 0;
        foreach (Main_menu item in Enum.GetValues(typeof(Main_menu)))
        {
            Console.Write($"{k} ");
            Console.Write(item);
            Console.WriteLine();
            k++;
        }
        Console.ReadLine();


    }

此枚举表示非常简单的类型菜单,在我处理的程序中,我不得不多次使用这种菜单,因此我更喜欢通过使用loop和使用快捷键Ctrl + Dot,我收到以下消息:

enum Main_menu { NewGame, Options, AboutAuthor, Exit }
    static void Main(string[] args)
    {

        int k = 0;
        k = LoopOverEnum(k);
        Console.ReadLine();


    }

    private static int LoopOverEnum(int k)
    {
        foreach (Main_menu item in Enum.GetValues(typeof(Main_menu)))
        {
            Console.Write($"{k} ");
            Console.Write(item);
            Console.WriteLine();
            k++;
        }

        return k;
    }
}

现在,我想将枚举Main_menu添加为变量,因此,我将能够在每个定义的枚举上应用此循环,我尝试如下操作:

namespace ConsoleApp11
{
class Program
{
    enum Main_menu { NewGame, Options, AboutAuthor, Exit }
    static void Main(string[] args)
    {

        int k = 0;
        k = LoopOverEnum(k, Main_menu);
        Console.ReadLine();


    }

    private static int LoopOverEnum(int k, enum Main_menu)
    {
        foreach (Main_menu item in Enum.GetValues(typeof(Main_menu)))
        {
            Console.Write($"{k} ");
            Console.Write(item);
            Console.WriteLine();
            k++;
        }

        return k;
    }
}
}

但是该函数的代码完全变为红色,并带有不同的错误。问题是:

1)如果enum是变量,那么如何编写遍历enum的函数?

2)如何在枚举术语的定义中使用空格?

4 个答案:

答案 0 :(得分:1)

k不应是Main中的局部变量。它应该是LoopOverEnum中的局部变量。

有两种将类型传递给方法的方法。您尝试LoopOverEnum(int k, enum Main_menu)是一个很好的尝试,但是很遗憾,它不是有效的C#。

您可以:

  • 使用通用类型参数:

    public static void LoopOverEnum<T>()
        int k = 0;
        foreach (T item in Enum.GetValues(typeof(T)))
        {
            Console.Write($"{k} ");
            Console.Write(item);
            Console.WriteLine();
            k++;
        }
    }
    // usage:
    LoopOverEnum<Main_menu>()
    
  • 使用类型为Type的参数:

    public static void LoopOverEnum(Type type)
        int k = 0;
        foreach (var item in Enum.GetValues(type))
        {
            Console.Write($"{k} ");
            Console.Write(item);
            Console.WriteLine();
            k++;
        }
    }
    
    // usage:
    LoopOverEnum(typeof(Main_menu))
    

答案 1 :(得分:0)

这是遍历枚举的通用方法:

EXECUTE

答案 2 :(得分:0)

public static IEnumerable<T> GetValues<T>() => Enum.GetValues(typeof(T)).Cast<T>();

用法:

foreach (Main_menu item in GetValues<Main_menu>())
    MessageBox.Show(item.ToString());

答案 3 :(得分:0)

遍历任何类型的枚举 枚举值中要有空格

您可以使用description属性,如下所示。您可以使用以下方法获取descriptionAttribute中提到的值。方法是通用的,因此可以与任何枚举一起使用。

using System.ComponentModel; 

public enum MyEnum 
{ 
    [Description("value 1")] 
    Value1, 

    [Description("value 2")]
    Value2, 

    [Description("value 3")]
    Value3
}


public static string GetDescription<T>( T e) 
{
      if (e is Enum)
      {
         Type type = e.GetType();
         Array values = System.Enum.GetValues(type);

         foreach (int val in values)
         {
              if (val == e.ToInt32(CultureInfo.InvariantCulture))
              {
                   var memInfo = type.GetMember(type.GetEnumName(val));
                   var descriptionAttribute = memInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false).FirstOrDefault() as DescriptionAttribute;

                if (descriptionAttribute != null)
                {
                      return descriptionAttribute.Description;
                 }
            }
        }
     }

      return null; // could also return string.Empty
}