【问题标题】:How can I define an enumeration where multiple values map to a single label?如何定义多个值映射到单个标签的枚举?
【发布时间】:2013-03-11 14:59:36
【问题描述】:

为了这个例子,假设我正在尝试解析一个文件,该文件指定记录中的两个任意字节代表一周中的哪一天,因此:

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# 枚举中捕获这一要求?

【问题讨论】:

  • 这个问题:如果往另一个方向发展,它会如何工作?从 int 值转到 enum 是可行的,但是如果您以另一种方式执行,c# 将如何知道 enum 应该转换为哪个 int 值?
  • 我想 type-safe-enum 模式应该很有趣。看看:stackoverflow.com/a/424414/1236044
  • 您能描述一下您将如何使用这个“保留”值吗?您将来会更改枚举,那么为什么要添加一些将更改的值(对于列出的值之一不是必需的)
  • 在这种特殊情况下,它只是一个例子;在实际问题中,实际上有几个字段可以是多个值之一。
  • 这是另一个动态生成枚举程序集的答案 - stackoverflow.com/a/792332/546000。有趣的东西。具有“保留”值的枚举的前提与枚举的概念相反。最多,如果您有一个包含大量查找表的数据库,生成一个枚举 DLL 可以帮助节省键入...但是动态生成一个动态生成会使得使用和调试非常困难。

标签: c# .net enums bitflags


【解决方案1】:

枚举的一个有趣的怪癖是定义为某种枚举类型的变量可以保存该枚举的任何成员未定义的值:

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-block 来处理未定义的值:

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;
    }
}

【讨论】:

    【解决方案2】:

    虽然一个给定的基础值可以映射到多个enum 值,但enum 值可以只有一个基础值。

    你可以这样做

    public enum DaysOfWeek
    {
         Monday = 0,
         Tuesday = 1,
         Wednesday = 2,
         Thursday = 3,
         Friday = 4,
         Saturday = 5,
         Sunday = 6
         Reserved1 = 7
         ...
         Reserved8 = 15
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-12
      • 1970-01-01
      • 1970-01-01
      • 2017-08-28
      • 2016-03-16
      • 1970-01-01
      • 2016-09-08
      相关资源
      最近更新 更多