为flag-type枚举定义“catchall”是明智的吗?

时间:2012-11-06 19:25:03

标签: c# enums

我有一个enum以下面的方式声明(但有更多选项 - 约15左右),因为我想要一种简单的方法来定义所有选项而不必明确列出它们。

[Flags]
enum Options
{
    Option1 = 1,
    Option2 = 2,
    Option3 = 4,
    Option4 = 8,
    AllOptions = 15
}

所以不要说

Options foo = Options.Option1 | Options.Option2 | Options.Option3 |... ad nauseum

我可以说

Options foo = Options.AllOptions;
这是明智的吗?或者是否有更好的方法可以为变量提供所有可用选项而无需明确列出它们?

2 个答案:

答案 0 :(得分:6)

  

或者是否有更好的方法可以为变量提供所有可用选项而无需明确列出它们?

好吧,你可以使用我的Unconstrained Melody项目:

Options allOptions = Flags.GetUsedBits<Options>();

(你可以使用Unconstrained Melody进行各种其他操作。)

我个人试图避免对“全部”值进行硬编码 - 添加新值并忘记更新“全部”值会非常容易。

(在这种情况下,我也避免将其命名为AllOptions - 它应该只是All,以避免Options.AllOptions中的冗余。)

如果您,请添加单元测试以确保您已正确完成:)

答案 1 :(得分:4)

你可以这样做:

[Flags]
enum Options
{
    Option1 = 1,
    Option2 = 2,
    Option3 = 4,
    Option4 = 8,
    AllOptions = Option1 | Option2 | Option3 | Option4
}

这种方法字面意思是Option1和Option2以及Option3和Option4。您可以将其用作:

Options.AllOptions;

Options.Option1 | Options.Option2 | Options.Option3 | Option.Option4

上述两种情况最终都会得到相同的结果。