C# 将枚举映射到[Flags]枚举
假设我有一个枚举:C# 将枚举映射到[Flags]枚举,c#,enums,flags,C#,Enums,Flags,假设我有一个枚举: public enum ItemStatus { Available, Unavailable } 我有一个方法,根据过滤器返回这些电视的列表。过滤器由枚举表示: [Flags] public enum ItemStatusFilter { Available = 1, Unavailable = 2 } 问题:什么是检查ItemStatus的给定实例是否与ItemStatusFilter的给定实例匹配的灵活方法 我不喜欢将值分配给ItemStatus成员
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
}
[标志]
公共枚举标记状态筛选器{
Available=1我不喜欢它..但它可以工作:
foreach (tv t in tvs)
{
if (isf.ToString().Contains(t.Status.ToString()))
{
//match
Console.WriteLine("matched");
}
}
如果两个枚举仅在[Flag]
属性中不同,则可以用于筛选IEnumerable
类型
因此,您有充分的理由使用两个枚举,然后最好使用
public bool Matches(ItemStatusFilter statusFilter, ItemStatus status)
{
return ((int)statusFilter & (int)status) > 0;
}
如果你想使用flag属性,你可以使用位操作。我已经写了一篇关于这个的博客文章,希望它能对你有用
如果一个枚举成员名称同时也是另一个成员的子字符串,则可能返回误报。在本例中不是这样,因为枚举的第一个字母是大写的。显然建议谨慎,我确实说我不喜欢它。但在本例中它肯定会起作用:)-1.您尚未理解标志enum和reg之间的区别重复枚举。重复枚举的原因是什么?