我已经搜索了如何在C#中切换值而不是枚举键,但是没有结果,我发现的所有帖子都说我们不需要使用该值,我们只需使用密钥即可。
但在我的情况下,我想使用该值,因为我使用多个键共享相同的值进行枚举,这是代码:
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();
}
上面的示例不起作用,因为它是一个重复的案例标签。我怎么能实现这一目标?
编辑:在此枚举中,North / Top,South / Bottom完全相同,它们只代表玩家在有4把椅子的桌子周围的位置。但我们有使用North / South / East / West的旧配置文件以及使用Top / Bottom / Right / Left的新配置文件。
我在dotnetfiddle中对此进行了测试:只需使用新成员即可:
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;
}
}
将输出“NORTH”。
编辑
只谈一下你面临的实际问题:向下兼容性。我要做的是在启动时检查配置是否与您当前的程序版本兼容。如果没有:通过“升级”功能(保存旧配置的备份然后)将配置转换为当前版本并将它们保存回磁盘。
您应该修改配置文件的解析器,以便在它成为问题之前解决此问题。
您的程序一次只能是一个版本。现在的方式,你有两个版本的配置文件,并且你试图同时维护两个版本的代码。
处理旧版配置文件的常规方法是在读取数据时将数据转换为新格式,或在首次打开时检测数据并将其在磁盘上转换为新版本(可选择通知用户)。
你不能用枚举来做到这一点。枚举的目的是每个项目具有不同的值,并且可以与其他项目区分开来。为什么你会使用Top和North是相同的东西,而你总是可以使用North并避免混淆顶部?我个人只有北,南,东和西,并删除其他人。
但是,据我所知,这应该有效:
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();
}
我无法理解为相同的枚举值设置两个不同标签背后的原因,而没有两个单独的枚举。 Firslty回答你的问题,你可以将枚举值转换为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());