我正在与几个位枚举枚举的代码库看起来像这样
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));
}
可以解决吗?
您可以使用Convert.ToInt64,因为它有很多重载:
public IEnumerable<TEnum> SingleFlagEnumValues<TEnum>()
{
return Enum.GetValues(typeof(TEnum))
.Cast<TEnum>()
.Where(e => IsPowerOfTwo(Convert.ToInt64(e)));
}
正如评论中所建议的,这里是为了优化:
static class SingleFlagCache<TEnum>
{
internal static TEnum[] values = Enum.GetValues(typeof(TEnum))
.Cast<TEnum>()
.Where(e => IsPowerOfTwo(Convert.ToInt64(e))).ToArray();
}
public static IEnumerable<TEnum> SingleFlagEnumValues<TEnum>()
=> SingleFlagCache<TEnum>.values;
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句