如何定义一个枚举,其中多个值映射到一个标签?

10

为了举例说明,假设我正在尝试解析一个文件,该文件指定记录中的两个任意字节表示一周中的某一天,如下:

DayOfWeek:

 - 0    = Monday
 - 1    = Tuesday
 - 2    = Wednesday
 - 3    = Thursday
 - 4    = Friday
 - 5    = Saturday
 - 6    = Sunday
 - 7-15 = Reserved for Future Use

我可以定义一个枚举来映射到该字段,如下:

public enum DaysOfWeek
{
     Monday = 0,
     Tuesday = 1,
     Wednesday = 2,
     Thursday = 3,
     Friday = 4,
     Saturday = 5,
     Sunday = 6
     ReservedForFutureUse
}

但是我如何定义 ReservedForFutureUse 的有效值?理想情况下,我想做的事情类似于:

public enum DaysOfWeek
    {
         Monday = 0,
         Tuesday = 1,
         Wednesday = 2,
         Thursday = 3,
         Friday = 4,
         Saturday = 5,
         Sunday = 6
         ReservedForFutureUse = {7,8,9,10,11,12,13,14,15}
    }

如果领域更加复杂,这个问题会变得更加严重;例如,假设在此情况下7和8都映射到相同的错误情况或其他情况。如何在C#枚举中捕获这个要求?


2
问题在于:反向转换如何实现?将 int 值转换为枚举值是可行的,但如果从枚举值转换为 int 值,则 C# 如何知道应该将其转换为哪个 int 值呢? - jzworkman
我猜类型安全的枚举模式应该很有趣。看一下:https://dev59.com/HnRC5IYBdhLWcg3wD8xV#424414 - jbl
你能描述一下你将如何使用这个“保留”值吗?由于你将来会更改枚举,那么为什么要添加一个将被更改的值(不一定是列出的值之一)? - Sergey Berezovskiy
在这个特定的情况下,这只是一个例子;在实际问题中,实际上有多个字段可以是几个值之一。 - GWLlosa
这里有另一个动态生成枚举程序集的答案 - https://dev59.com/aHRB5IYBdhLWcg3wFz8g#792332。很有趣。在枚举中使用“保留”值的前提与枚举的概念背道而驰。如果你有一个拥有大量查找表的数据库,生成一个枚举DLL可以帮助节省打字时间...但是在运行时动态生成一个枚举会使使用和调试变得非常困难。 - Dmitriy Khaykin
2个回答

5
枚举类型的一个有趣特性是,定义为某个枚举类型的变量可以保存并持有该枚举中未定义的值。
public enum DaysOfWeek
{
     Monday = 0,
     Tuesday = 1,
     Wednesday = 2,
     Thursday = 3,
     Friday = 4,
     Saturday = 5,
     Sunday = 6
}

// in other code
DaysOfWeek someDay = (DaysOfWeek)42; // this is perfectly legal

这意味着您不需要定义所有可能出现的值,而只需指定对您的代码有意义的值。然后,您可以使用一些“万能”的if-或switch块来处理未定义的值:
switch (someDay)
{
    case DaysOfWeek.Monday:
    {
        // do monday stuff
        break;
    }
    case DaysOfWeek.Tuesday:
    {
        // do tuesday stuff
        break;
    }
    // [...] handle the other weekdays [...]
    default:
    {
        // handle undefined values here
        break;
    }
}

3
虽然一个基本值可能被映射到多个枚举值,但枚举值只能有一个基本值。你可以这样做:
public enum DaysOfWeek
{
     Monday = 0,
     Tuesday = 1,
     Wednesday = 2,
     Thursday = 3,
     Friday = 4,
     Saturday = 5,
     Sunday = 6
     Reserved1 = 7
     ...
     Reserved8 = 15
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接