C # Как использовать Enums как в C ++? - PullRequest
0 голосов
/ 22 декабря 2018

В C ++ у меня может быть такое перечисление

enum RoomItems {
  WALL = 0,
  EMPTY = 1,
  START = 2,
  LOCK = 3,
  EXIT = 4
};

, а затем использовать его в коде, подобном следующему:

Room temp = new Room({ WALL, START, LOCK });

Вот как я бы сделал это в C # (чтобымои текущие знания)

Room temp = new Room(new List<RoomItems>() { RoomItems.WALL, RoomItems.START, RoomItems.LOCK });

Это довольно раздражает, когда у вас есть, например, большие списки этих "предметов".В моей версии C ++ этой программы комнаты могут иметь количество элементов в 20-х годах, и хотя в моем коде на C ++ это выглядит довольно аккуратно, в версии C # моей программы строки кода были бы слишком длинными.

Есть ли способ, которым я могу использовать перечисления без использования их имени (как без RoomItems. *), И если нет, то есть ли лучшая альтернатива?

Ответы [ 3 ]

0 голосов
/ 22 декабря 2018

То, что вы ищете, имея возможность ссылаться на члены типа без указания имени типа, поддерживается начиная с C # 6.0, вплоть до с использованием статической директивы .

Inфайл, на который ссылается ваше перечисление:

using static YourNameSpace.RoomItems;

[...]

var temp = new Room(new [] { WALL, START, LOCK });

(Это передает элементы в виде массива, а не списка, поэтому убедитесь, что ваш конструктор Room принимает IEnumerable<RoomItem>. Вы можете использовать .ToList(), если выабсолютно необходимо использовать списочные функции в конструкторе.)

0 голосов
/ 22 декабря 2018

Вы можете инициализировать свою комнату с помощью инициализатора коллекции :

using static YourNameSpace.RoomItems;

var temp = new Room() { WALL, START, LOCK };

, если класс вашей комнаты реализует IEnumerable и предоставляет открытый метод добавления:

class Room : IEnumerable<RoomItems>
{
    List<RoomItems> items = new List<RoomItems>();

    public void Add(RoomItems item)
    {
        items.Add(item);
    }

    public IEnumerator<RoomItems> GetEnumerator()
    {
        return items.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

Edit: становится еще более похожим, если вы добавляете mbj с использованием статической директивы.

0 голосов
/ 22 декабря 2018

Да, вы можете использовать params вместо передачи списка.Предполагая, что конструктор Room определен как:

public Room(params RoomItems[] items){ ... }

, вы можете сделать:

Room temp = new Room(WALL, START, LOCK );

Обратите внимание, что импорт static (директива AKA, using static)) из RoomItems необходимо, в противном случае вам придется использовать префикс полного имени, как в:

Room temp = new Room(RoomItems.WALL, RoomItems.START, RoomItems.LOCK );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...