作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在this question ,我在 enum
和 [Flags]
属性之间使用 xor 运算符,如下所示:
[Flags]
enum QueryFlag
{
None = 0x1,
ByCustomer = 0x2,
ByProduct = 0x4,
ByDate = 0x8
}
QueryFlag flags = QueryFlag.ByCustomer | QueryFlag.ByProduct;
要添加一个QueryFlag,我们当然应该使用|
操作符。
flags |= QueryFlag.ByDate;
要删除一个,我有一种不同的方式 Dan Tao's answer .我正在使用:
flags ^= QueryFlag.ByProduct;
当他使用时:
flags &= ~QueryFlag.ByProduct;
显然他的回答是正确的,也很容易理解。我以为我弄错了。但经过深思熟虑,我得到:
a,b a^b a&(~b)
0,0 0 0
0,1 1 0 //the difference
1,0 1 1
1,1 0 0
现在我知道我错了。 ^
当您尝试删除一个不存在的项目时是错误的。
QueryFlag q = QueryFlag.ByCustomer | QueryFlag.ByDate;
//try to remove QueryFlag.ByProduct which doesn't exist in q
q ^ QueryFlag.ByProduct //equals to add ByProduct to q, wrong!
q & (~QueryFlag.ByProduct) // q isn't changed, remain the original value. correct!
但在这里我又遇到了另一个问题:我怎么知道 q
是否包含一个项目?根据丹涛的回答我写了一个扩展:
public static bool Contains(this QueryFlag flags, QueryFlag flag)
{
return (flags & (~flag)) != flags;
}
也就是说,如果从 flags 中删除 flag 后 flags 没有改变,我们知道 flag 不在 flags 中!在以下情况下似乎是正确的:
(QueryFlag.ByProduct | QueryFlag.ByDate).Contains(QueryFlag.None) //false
(QueryFlag.ByProduct | QueryFlag.ByDate).Contains(QueryFlag.ByDate) //true
但实际上:
(QueryFlag.ByProduct | QueryFlag.ByDate).Contains(QueryFlag.ByDate | QueryFlag.ByCustomer) //true, but I suppose it's false
我知道错误的原因,我该如何改进?这是第一个问题。第二个:我想让 .Contains
通用到更多具有 [Flags]
属性的 enum
。
public static bool Contains<T>(this T flags, T flag) where T : Enum//with [Flags]
{
return (flags & (~flag)) != flags;
}
可能无法用标记的属性来约束 T。但即使我删除了这个约束,我也会收到一个编译错误,提示 operator ~ can't be applied to type T
。为什么以及如何解决?
最佳答案
你的错误在于这个方法:
public static bool Contains(this QueryFlag flags, QueryFlag flag)
{
return (flags & (~flag)) != flags;
}
只要 flags
有任何(即至少一个)包含在 flag
中的标志,这将返回 true ,但我认为您想要全部。
它应该是:
public static bool Contains(this QueryFlag flags, QueryFlag flag)
{
return (flags & flag) == flag;
}
或者,您可以只使用 Enum.HasFlag()
来完成此操作。例如:
QueryFlag qf = ...;
if (qf.HasFlag(QueryFlag.ByCustomer))
// ...
关于c# - 我怎么知道项目在枚举中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3748516/
我是一名优秀的程序员,十分优秀!