使用Flags Enum作为普通枚举

时间:2015-12-14 13:05:21

标签: c# enums

有没有办法可以选择强制.box_1 enum为"非Flags"特定用途?

例如,说我有

[Flags]

现在让我们说我有两个班级enum MyEnum { X , Y , Z } A。 B类主要用于B。 A类负责解析此列表,但仅在枚举与特定值匹配时才负责;

IEnumerable<B>

现在假设我希望A类能够使用多种类型的B.我可以将[F​​lags]属性添加到我的枚举中并执行以下操作:

 class B {
      MyEnum MyProperty { get; set; }
  }

 class A {
      MyEnum Target = MyEnum.C;
      void DoSomething(IEnumerable<B> list) {

           for (var b in list) {
               if (b.MyProperty == this.Target) {
                   // Do Some Work
               }
           }
      }
 }

然而,B类的[Flags] enum MyEnum { None = 0, X = 1, Y = 2, Z = 4 } class B { MyEnum MyProperty { get; set; } } class A { MyEnum Target = MyEnum.X | MyEnum.Z; void DoSomething(IEnumerable<B> list) { for (var b in list) { if (this.Target.HasFlag(b.MyProperty)) { // Do Some Work } } } } 现在可以用作旗帜,这是一个问题,因为在{{MyProperty的上下文中没有MyEnum.X | MyEnum.Y这样的东西。 1}}。这在B.MyProperty中是有道理的,因为我的目标是各种B类。

我想出的工作是:

A

虽然这有效,但它确实很混乱。我现在必须跟踪两个不同的枚举。我在一个中做出的任何改变,我必须在另一个中进行,我必须确保值是同步的。最重要的是,我现在必须转发enum MyEnum { None = 0, X = 1, Y = 2, Z = 4 } [Flags] enum MyEnumTarget { None = 0, X = 1, Y = 2, Z = 4 } class B { MyEnum MyProperty { get; set; } } class A { MyEnumTarget Target = MyEnumTarget.X | MyEnumTarget.Z; void DoSomething(IEnumerable<B> list) { for (var b in list) { if (this.Target.HasFlag((MyEnumTarget)b.MyProperty)) { // Do Some Work } } } } 才能将值传递给MyEnumTarget。虽然我可以进行逐步操作,但其目的并不总是那么明显。无论哪种方式,我仍然需要两个&#34;匹配&#34;枚举。

有没有更好的方法呢?有没有办法使用单个枚举类型并在Enum.HasFlag强制某种[NoFlags]属性。或者将两个枚举视为最佳方式/良好做法?

如果重要,我会使用C#6.0

2 个答案:

答案 0 :(得分:1)

从根本上说,每个枚举类型设计为有点掩码,或者不是。您可能会考虑的选项:

  • 两个单独的枚举,根据您的代码
  • 一个非标记枚举,但要A.Property一个List<MyEnum>或类似的
  • 一个标记枚举,但让B.Property setter验证只设置了一个位,否则抛出ArgumentException

答案 1 :(得分:0)

这两种用途有什么不同?听起来这些应该是两个不同的枚举因为它们的含义是不同的。他们使用的合同是不同的。如果这些是课程,我建议应用Interface Segregation Principle,因为不同的客户以不同的方式使用它们。

由于这些是枚举,您可以将它们包装在具有接口隔离​​的类中,或者至少区分两个枚举。