C# Switch on enum with multiple keys for same value
我已经在C中搜索了如何打开值而不是枚举键,但是没有结果,我找到的所有帖子都说我们不需要使用值,我们可以只使用键。
但是在我的例子中,我想使用这个值,因为我做了一个枚举,有多个键共享相同的值,下面是代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | public enum PlayerPosition { North = 0, Top = 0, South = 1, Bottom = 1, East = 2, Right = 2, West = 3, Left = 3 } switch (obj.PlayerPosition) { case PlayerPosition.North: // some code break; case PlayerPosition.South: // some code break; case PlayerPosition.East: // some code break; case PlayerPosition.West: // some code break; default: throw new ArgumentOutOfRangeException(); } |
我认为这是可行的,但我觉得它不太可读…
我想要达到的目标是:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | switch (obj.PlayerPosition) { case PlayerPosition.Top: case PlayerPosition.North: // some code break; case PlayerPosition.Bottom: case PlayerPosition.South: // some code break; case PlayerPosition.Right: case PlayerPosition.East: // some code break; case PlayerPosition.Left: case PlayerPosition.West: // some code break; default: throw new ArgumentOutOfRangeException(); } |
上面的示例不起作用,因为它是一个重复的case标签。我怎么能做到?
编辑:在这个枚举中,north/top、south/bottom是完全相同的,它们只是表示玩家在一张有4把椅子的桌子周围的位置。但是我们有使用北/南/东/西的旧配置文件和使用上/下/右/左的新配置文件。
我在一个dotnetfidle中测试了这一点:仅仅使用新成员就可以:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | public enum MyEnum { North = 0, //old Top = 0, //new South = 1, //old Bottom = 1 //new } public static void Main() { // Parse"old" from XML config (simulated) MyEnum test = (MyEnum)Enum.Parse(typeof(MyEnum),"North"); // = MyEnum.North switch(test) { case MyEnum.Top: Console.WriteLine("NORTH"); break; case MyEnum.Bottom: Console.WriteLine("SOUTH"); break; default: Console.WriteLine("Unsupported!"); break; } } |
将输出"北"。
编辑
只需简单介绍一下您所面临的实际问题:向下兼容性。我要做的是在启动时检查配置是否与您当前的程序版本兼容。如果没有:执行"升级"功能(保存旧配置的备份,然后)将配置转换为当前版本并将其保存回磁盘。
您应该修改配置文件的解析器,以便在问题出现之前解决这个问题。
您的程序一次只能是一个版本。现在的情况是,您有两个版本的配置文件,并且您试图同时维护两个版本的代码。
处理旧版本配置文件的正常方法是在读取数据时将其转换为新格式,或者在首次打开数据时检测数据并将其在磁盘上转换为新版本(可选通知用户)。
不能使用枚举执行此操作。枚举的目的是每个项将具有不同的值,并且可以与其他项区分开来。为什么你会有顶和北是一样的东西,而你可以一直使用北,并避免混淆有顶另外?我个人只会有北、南、东、西,然后把其他的都搬走。
然而,据我所知,这应该是有效的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | public enum PlayerPosition { North, Top, South, Bottom, East, Right, West, Left } switch (obj.PlayerPosition) { case PlayerPosition.Top: case PlayerPosition.North: // some code break; case PlayerPosition.Bottom: case PlayerPosition.South: // some code break; case PlayerPosition.Right: case PlayerPosition.East: // some code break; case PlayerPosition.Left: case PlayerPosition.West: // some code break; default: throw new ArgumentOutOfRangeException(); } |
如果没有两个独立的枚举值,我无法理解为同一枚举值使用两个不同标签的原因。首先,要回答您的问题,您可以将枚举值强制转换为int,然后对int进行比较…
1 | int value = (int)obj.PlayerPosition |
但我可能会考虑删除重复的值并使用两个枚举
1 2 3 4 5 6 7 8 9 10 11 12 13 | public enum PlayerPosition { Top = 0, Bottom = 1, Right = 2, Left = 3 } public enum CompassPosition { North = 0, South= 1, East= 2, West = 3 } |
如果你想在这两者之间转换,你可以直接施法,例如
1 2 3 | PlayerPosition pos = PlayerPosition.Left; CompassPosition compass = (CompassPosition)pos; Console.WriteLine(compass.ToString()); |