C#如何像在C ++中一样使用枚举?

时间:2018-12-22 18:40:55

标签: c# enums

在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 :(得分:3)

是的,您可以使用params而不是传递列表。假设Room构造函数定义为:

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

您可以执行以下操作:

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

请注意,static的{​​{1}}导入(又名using static directive)是必需的,否则您必须为全名加上前缀,如下所示:

RoomItems

答案 1 :(得分:3)

从C#6.0开始,通过using static directive,支持您要查找的类型而不指定类型名称的引用。

在引用您的枚举的文件中:

using static YourNameSpace.RoomItems;

[...]

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

(这会将项目作为数组而不是列表传递,因此请确保您的Room构造函数接受IEnumerable<RoomItem>。如果您绝对需要在构造函数中使用特定于列表的功能,则可以使用.ToList()

答案 2 :(得分:0)

您可以使用collection initializer初始化房间:

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

编辑:如果使用静态指令添加mbj,则变得更加相似。