【发布时间】:2021-06-28 15:57:22
【问题描述】:
我必须为我声明的每个标志类型构建一个扩展方法,如下所示:
public static EventMessageScope SetFlag(this EventMessageScope flags,
EventMessageScope flag, bool value)
{
if (value)
flags |= flag;
else
flags &= ~flag;
return flags;
}
为什么没有Enum.SetFlag 就像有Enum.HasFlag 一样?
另外,为什么这并不总是有效?
public static bool Get(this EventMessageScope flags, EventMessageScope flag)
{
return ((flags & flag) != 0);
}
例如,如果我有:
var flag = EventMessageScope.Private;
然后检查它:
if(flag.Get(EventMessageScope.Public))
EventMessageScope.Public 真的是EventMessageScope.Private | EventMessageScope.PublicOnly,它返回 true。
如果不是,因为Private 不是公开的,它只是半公开的。
同样适用:
if(flag.Get(EventMessageScope.None))
哪个返回false,除了范围实际上是None (0x0),什么时候它应该总是返回true?
【问题讨论】:
-
@CodyGray, |= 运算符更短,但假定熟悉标志的二进制实现,SetFlag 更直观。
-
我喜欢你的问题,觉得它完全合乎逻辑。我希望有一天微软会编写一个标准的 SetFlag。感谢询问
-
@CodyGray 不是 1 行而不是 4 行(当你有一个布尔值和一个标志作为输入时)每次你想设置一个标志就足够了编写扩展方法的动机?如果我需要 4 行来为一个数字加 1,我肯定会写一个
AddOneToInteger方法。