0

我有一个枚举,假设:

public enum ItemStatus {
    Available, Unavailable
}

我有一个基于过滤器返回这些电视列表的方法。过滤器由 Enum 表示:

[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这里被滥用了?

4

3 回答 3

0

我不喜欢它..但它会工作:

        foreach (tv t in tvs)
        {
            if (isf.ToString().Contains(t.Status.ToString()))
            {
                //match
                Console.WriteLine("matched");
            }
        }
于 2009-09-24T15:47:03.023 回答
0

如果要使用标志属性,可以使用按位运算。我已经写了一篇关于这个的博客文章,我希望它对你有用。

http://ehsanghanbari.com/Post/86/why-the-values-of-enums-are-bit-flag-in-net

于 2014-01-26T20:09:43.710 回答
-1

如果两个枚举仅在[Flag]属性上有所不同,则可以用于过滤IEnumerable<ItemStatus>类型。

所以你有充分的理由使用两个枚举,然后最好用

public bool Matches(ItemStatusFilter statusFilter, ItemStatus status)
{
    return ((int)statusFilter & (int)status) > 0;
}
于 2013-06-24T13:19:02.120 回答