Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将枚举映射到[Flags]枚举_C#_Enums_Flags - Fatal编程技术网

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之间的区别重复枚举。重复枚举的原因是什么?