2009-09-24 179 views
0

我有一個枚舉,假設:地圖枚舉爲[標誌]枚舉

public enum ItemStatus { 
    Available, Unavailable 
} 

我有一個返回的電視列表,基於過濾器的方法。

[Flags] 
public enum ItemStatusFilter { 
    Available = 1, Unavailable = 2 
} 

問:什麼是檢查是否ItemStatus給出實例相匹配給出ItemStatusFilter的實例光滑的方式而濾波器是由枚舉表示?

我不喜歡爲ItemStatus成員賦值(1,2)的想法,因爲它不是該枚舉所要求的。現在我的代碼看起來如下:

public static bool Matches(this TagStatusFilter statusFilter, TagStatus status) { 
    if (status == TagStatus.Available && ((statusFilter & TagStatusFilter.Available) != 0)) return true; 
    if (status == TagStatus.Unavailable && ((statusFilter & TagStatusFilter.Unavailable) != 0)) return true; 
    return false; 
} 

沿着這些方向怎麼辦?

[Flags] 
public enum TagStatusFilter { 
    Available = 1 << TagStatus.Available, 
    Unavailable = 1 << TagStatus.Unavailable 
} 

目標是減少代碼量,並減少類型之間的耦合。

是否覺得enum TagStatusFilter在這裏被濫用?

回答

0

我不喜歡它。但它會工作:

 foreach (tv t in tvs) 
     { 
      if (isf.ToString().Contains(t.Status.ToString())) 
      { 
       //match 
       Console.WriteLine("matched"); 
      } 
     } 
+0

可能返回誤報,如果一個枚舉成員的名字也是另一個成員的子字符串。 – 2009-09-25 12:37:32

+0

不在此例中,因爲枚舉的第一個字母是大寫。 小心顯然是建議,我確實說我不喜歡它..但它肯定會在這個實例工作:) – Sk93 2009-09-26 16:04:14

-1

如果兩個枚舉的區別僅在於[Flag]屬性,那麼您可以使用過濾IEnumerable<ItemStatus>類型。

所以,你必須使用兩個枚舉強有力的理由,然後它更好地與

public bool Matches(ItemStatusFilter statusFilter, ItemStatus status) 
{ 
    return ((int)statusFilter & (int)status) > 0; 
} 
+0

-1。你還沒有理解標誌枚舉和常規枚舉之間的區別。 – jgauffin 2013-06-24 14:20:48

+0

複製枚舉的原因是什麼? – Artru 2013-06-24 16:16:09