循环各种枚举的函数

Function that does loop over various enum

例如,让我们枚举并遍历它

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();


    }

这个枚举代表非常简单的类型菜单,在我工作的程序中,我不得不多次使用这种菜单,所以我更喜欢将它添加到一个单独的函数中,通过针对代码的一部分循环并使用热键 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) 如何编写遍历枚举的函数,因为枚举是可变的?

2) 如何在枚举项的定义中使用 space ?

这是循环枚举的通用方法:

static void IterateEnum<T>(T enumSource)
{
    foreach(var item in Enum.GetValues(typeof(T)))
    {
        Console.WriteLine(item);
    }
}
public static IEnumerable<T> GetValues<T>() => Enum.GetValues(typeof(T)).Cast<T>();

用法:

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

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

迭代任何类型的枚举并且 在枚举值中包含空格

您可以使用 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
}