【发布时间】:2019-12-09 11:04:10
【问题描述】:
我正在开发一个代码库,其中包含几个看起来像这样的位标志枚举
public enum BitMask
{
None = 0,
OptionA = 1 << 0,
OptionB = 1 << 1,
OptionAandB = OptionA | OptionB,
All = ~0
}
我可以使用这个遍历所有枚举值
public IEnumerable<T> EnumValues<T>()
{
return Enum.GetValues(typeof(T)).Cast<T>();
}
我正在寻找一种仅迭代单个标志值的通用方法,在本例中为OptionA 和OptionB。 不是 None、OptionAandB、All。我可以转换为 long 并检测单个标志,因为它们是 2 的幂,在此处快速搜索表明这一点
public bool IsPowerOfTwo(long val)
{
return (val != 0) && ((val & (val-1)) == 0) ;
}
非通用版本工作正常
public IEnumerable<BitMask> SingleFlagBitMaskValues()
{
return Enum.GetValues(typeof(BitMask))
.Cast<BitMask>()
.Where(e => IsPowerOfTwo((long)e));
}
但通用版本无法编译,因为它不喜欢转换为 long
public IEnumerable<TEnum> SingleFlagEnumValues<TEnum>()
{
return Enum.GetValues(typeof(TEnum))
.Cast<TEnum>()
.Where(e => IsPowerOfTwo((long)e));
}
有什么办法吗?
【问题讨论】:
标签: c# enums ienumerable bitmask