簡體   English   中英

將枚舉映射到[標志]枚舉

[英]Map Enum to [Flags] Enum

我有一個枚舉,假設:

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在這里被濫用了嗎?

我不喜歡它..但是可以用:

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

如果要使用標志屬性,則可以使用按位運算。 我已經寫了一篇關於此的博客文章,希望對您有用。

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

如果兩個枚舉僅在[Flag]屬性中有所不同,則可以用於過濾IEnumerable<ItemStatus>類型。

因此,您有充分的理由使用兩個枚舉,然后最好使用

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

暫無
暫無

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

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