[英]Map Enum to [Flags] Enum
I have an Enum, suppose: 我有一个枚举,假设:
public enum ItemStatus {
Available, Unavailable
}
I have a method that returns a list of those TVs, based on a filter. 我有一个基于过滤器返回这些电视列表的方法。 And a filter is represented by an Enum: 过滤器由枚举表示:
[Flags]
public enum ItemStatusFilter {
Available = 1, Unavailable = 2
}
Question: what is a slick way to check if given instance of ItemStatus matches given instance of ItemStatusFilter? 问题:检查给定的ItemStatus实例是否匹配给定的ItemStatusFilter实例的巧妙方法是什么?
I dislike the idea of assigning values to ItemStatus members (1,2) since it is not required by that enum. 我不喜欢将值分配给ItemStatus成员(1,2)的想法,因为该枚举不是必需的。 Right now my code looks as follows: 现在,我的代码如下所示:
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;
}
What about something along these lines? 这些东西呢?
[Flags]
public enum TagStatusFilter {
Available = 1 << TagStatus.Available,
Unavailable = 1 << TagStatus.Unavailable
}
The goal is to reduce amount of code, and reduce coupling between types. 目标是减少代码量,并减少类型之间的耦合。
Does it feel like enum TagStatusFilter
is misused here? 感觉像enum TagStatusFilter
在这里被滥用了吗?
i don't like it.. but it'll work: 我不喜欢它..但是可以用:
foreach (tv t in tvs)
{
if (isf.ToString().Contains(t.Status.ToString()))
{
//match
Console.WriteLine("matched");
}
}
you can use bit wise operation, if you want to use flag attribute. 如果要使用标志属性,则可以使用按位运算。 I've written a blog post about this, I hope it could be useful for you. 我已经写了一篇关于此的博客文章,希望对您有用。
http://ehsanghanbari.com/Post/86/why-the-values-of-enums-are-bit-flag-in-net http://ehsanghanbari.com/Post/86/why-the-values-of-enums-are-bit-flag-in-net
If two enums differs only in [Flag]
attribute, then you can use for filtering IEnumerable<ItemStatus>
type. 如果两个枚举仅在[Flag]
属性中有所不同,则可以用于过滤IEnumerable<ItemStatus>
类型。
So you have strong reasons to use two enums then it better to filter with 因此,您有充分的理由使用两个枚举,然后最好使用
public bool Matches(ItemStatusFilter statusFilter, ItemStatus status)
{
return ((int)statusFilter & (int)status) > 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.