C#使用多个键为同一值打开枚举
我已经搜索过如何在C#中切换值而不是枚举键,但是没有结果,我找到的所有帖子都说我们不需要使用值,我们可以使用键 但在我的例子中,我想使用该值,因为我进行了一个枚举,多个键共享相同的值,下面是代码:C#使用多个键为同一值打开枚举,c#,.net,enums,switch-statement,C#,.net,Enums,Switch Statement,我已经搜索过如何在C#中切换值而不是枚举键,但是没有结果,我找到的所有帖子都说我们不需要使用值,我们可以使用键 但在我的例子中,我想使用该值,因为我进行了一个枚举,多个键共享相同的值,下面是代码: public enum PlayerPosition { North = 0, Top = 0, South = 1, Bottom = 1, East = 2, Right = 2, West = 3, Left = 3 } sw
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();
}
我认为这是工作,但我不觉得它真的可读
我想要实现的是这样的目标:
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();
}
上面的示例不起作用,因为它是重复的案例标签。
我怎样才能做到这一点
编辑:在这个枚举中,北/上、南/下是完全相同的,它们只代表玩家在一张有4把椅子的桌子周围的位置。但是我们有使用北/南/东/西的旧配置文件和使用上/下/右/左的新配置文件。如果没有两个单独的枚举,我无法理解为同一枚举值使用两个不同标签的原因。首先要回答您的问题,您可以将枚举值强制转换为int,然后对int进行比较
int value = (int)obj.PlayerPosition
但我可能会考虑删除重复的值并使用两个枚举
public enum PlayerPosition {
Top = 0,
Bottom = 1,
Right = 2,
Left = 3
}
public enum CompassPosition {
North = 0,
South= 1,
East= 2,
West = 3
}
如果你想在两者之间转换,你可以直接转换,例如
PlayerPosition pos = PlayerPosition.Left;
CompassPosition compass = (CompassPosition)pos;
Console.WriteLine(compass.ToString());
不能使用枚举执行此操作。枚举的目的是使每个项具有不同的值,并且可以与其他项区分开来。为什么你会让Top和North是同一件事,而你可以一直使用North,避免另外添加Top的混淆?我个人只会有北,南,东,西,并删除其他 然而,据我所知,这应该是可行的:
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();
}
我在a中对此进行了测试:仅使用新成员即可:
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;
}
}
将输出“北”
编辑
关于你所面临的实际问题,只需说一句话:向下兼容性。
我要做的是在启动时检查配置是否与您当前的程序版本兼容。如果没有:执行“升级”功能(保存旧配置的备份,然后)将配置转换为当前版本并将其保存回磁盘 您应该修改配置文件的解析器,以便在它成为问题之前解决这个问题 您的程序一次只能有一个版本。按照现在的方式,您有两个版本的配置文件,并且您试图同时维护两个版本的代码
处理旧版本配置文件的常规方法是在读取数据时将其转换为新格式,或在首次打开时检测数据并将其在磁盘上转换为新版本(可选通知用户)。这些别名枚举是。。。。邪恶。但在你的开关中,选择北/南或上/下。您不需要同时使用这两个枚举值,也不能同时使用这两个枚举值。如果您有不同的枚举值,则可以使用第二个版本。或者对某些枚举成员使用相同的值,然后只需使用第一个版本(并使用“主”枚举成员)。问题出在哪里?如果您确实需要同时查看这两种情况,请对第二种情况进行注释。只需使用新的枚举成员即可。它应该可以工作:(没有DV)OP在问题中解释了为什么他需要它。仅仅使用新的enum成员也可以工作。例如:从XML解析:
value=PlayerPosition.North
将输入案例PlayerPosition.Top
。我用小提琴测试了这一点(参见我对问题的评论)@Hoots我不能用两个单独的枚举来做这件事,这里的问题是枚举将从XML文件解析,并反序列化为一个持有PlayerPosition的对象。好的,我可能仍然有两个枚举。。。除了从Xml文件中读取将发生到PlayerPosition的转换时,所有操作都使用PlayerPosition。序列化如何?如果在内部是0,是北还是顶0?我认为这个解决方案将是最难实现的,我真的不想麻烦转换,因为对我的对象的反序列化为我处理了这个问题。这是一个很好的观点,我应该测试一下它需要哪个键。吹毛求疵:这是问题的解决方案,但不是问题的解决方案。。。(虽然我同意)费尔多是对的,但这肯定是我最终要做的。读取时修改配置文件肯定是在代码中只保留一个版本的方法。@Fildor:Yep。这是通常的回答方式。@MarkBenningflied我不知道XY的问题是什么,谢谢@费尔多:是的,但我也知道用户只是因为牙痛就用DV发帖子,所以担心这一点并没有什么好处。现在,如果他们中有十个人用DV记录了这件事,那可能就是有问题了。