2009-09-24 183 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