关于.net:C#使用多个键为相同的值打开枚举

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