[英]Use Flags Enum as a normal Enum
有沒有一種方法可以選擇性地將[Flags]
枚舉強制為“ Flags”以用於特定用途?
例如說我有
enum MyEnum {
X ,
Y ,
Z
}
現在假設我有兩個班級A
和B
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一起使用。我可以將[Flags]屬性添加到我的枚舉中,並執行以下操作:
[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.