在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。*一样),如果没有,那么还有更好的选择吗?
答案 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,则变得更加相似。