Функция, которая делает цикл по различным перечислениям - PullRequest
0 голосов
/ 02 января 2019

Например, позвольте быть 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;
    }
}

Теперь я хочу добавить enum 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) Как использовать пробел в определении терминов перечисления?

Ответы [ 4 ]

0 голосов
/ 02 января 2019

Чтобы перебрать enum любого типа А Чтобы иметь пробелы в значениях enum

, вы можете использовать атрибут 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
}
0 голосов
/ 02 января 2019
public static IEnumerable<T> GetValues<T>() => Enum.GetValues(typeof(T)).Cast<T>();

Использование:

foreach (Main_menu item in GetValues<Main_menu>())
    MessageBox.Show(item.ToString());
0 голосов
/ 02 января 2019

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))
    
0 голосов
/ 02 января 2019

Вот общий способ зацикливания Enums:

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