簡體   English   中英

將標志枚舉用作普通枚舉

[英]Use Flags Enum as a normal Enum

有沒有一種方法可以選擇性地將[Flags]枚舉強制為“ Flags”以用於特定用途?

例如說我有

enum MyEnum {
     X ,
     Y , 
     Z 
 }

現在假設我有兩個班級AB B類將主要在IEnumerable<B> 類A負責解析此列表,但僅在枚舉匹配特定值時;

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

現在假設我希望類A能夠與多種類型的B一起使用。我可以將[F​​lags]屬性添加到我的枚舉中,並執行以下操作:

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

但是,現在可以將類B的MyProperty用作標志,這是一個問題,因為沒有MyEnum.X | MyEnum.Y MyEnum.X | MyEnum.Y中的B.MyProperty A之內有意義是因為我針對的是各種B類。

我提出的解決方法是:

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才能將值傳遞給Enum.HasFlag 當然,我可以進行按位操作,但意圖並不總是那么明顯。 無論哪種方式,我仍然需要兩個“匹配”的枚舉。

有沒有更好的辦法做到這一點? 是否有某種方式使用單個枚舉類型,並迫使某種[NoFlags]屬性上B.MyProperty 還是讓兩個枚舉被認為是最佳方法/最佳實踐?

如果重要,我正在使用C#6.0

從根本上說,無論是設計成具有每個枚舉類型是位掩碼,或者不是。 您可能會考慮的選項:

  • 根據您的代碼兩個獨立的枚舉
  • 一個非標志枚舉,但將A.Property List<MyEnum>或類似名稱
  • 一個標志枚舉,但使B.Property設置程序驗證僅設置了一個位,否則拋出ArgumentException

兩種用途有什么不同? 聽起來這應該是兩個不同的枚舉,因為它們的含義不同。 它們的使用合同不同。 如果這些是類,我建議您應用接口隔離原則 ,因為不同的客戶端以不同的方式使用它們。

由於這些是枚舉,因此可以將它們包裝在具有接口隔離​​的類中,或者至少區分兩個枚舉。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM