位掩码枚举的通用单标志枚举

jbat100

我正在与几个位枚举枚举的代码库看起来像这样

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>();
}

我在寻找一个通用的办法只能遍历一个标志值,在这种情况下,OptionAOptionB NoneOptionAandBAll我可以强制转换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));
}

可以解决吗?

骨el

您可以使用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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

枚举值中包含的位掩码标志的最佳方法是什么?

来自分类Dev

通用枚举

来自分类Dev

从枚举表展平T-SQL位掩码

来自分类Dev

使用默认参数将位掩码作为成员枚举

来自分类Dev

提取枚举标志以使用通用方法列出?

来自分类Dev

如何在.NET Standard中为通用枚举类型设置枚举标志?

来自分类Dev

如何在.NET Standard中为通用枚举类型设置枚举标志?

来自分类Dev

反转枚举标志

来自分类Dev

删除枚举标志

来自分类Dev

用标志打开枚举

来自分类Dev

建立枚举标志列表

来自分类Dev

反转枚举标志

来自分类Dev

如何使用枚举标志?

来自分类Dev

枚举和单例

来自分类Dev

索引一个由通用枚举定义位的BitArray

来自分类Dev

通用枚举类型防护

来自分类Dev

是否有用于标记/位掩码操作的Python类/枚举?

来自分类Dev

如何在Swift中为SpriteKit定义类别位掩码枚举?

来自分类Dev

如何在Swift中创建NS_OPTIONS样式的位掩码枚举?

来自分类Dev

将位掩码整数和枚举存储为相同的值。如何?

来自分类Dev

将NS_OPTIONS枚举(UIRemoteNotificationType)位掩码转换为NSString分隔值

来自分类Dev

按描述比较标志枚举

来自分类Dev

键入安全的枚举位标志

来自分类Dev

如何结合枚举和标志?

来自分类Dev

通过fsharp中的模式匹配和按位组合枚举标志来避免“干净易变”

来自分类Dev

与枚举

来自分类Dev

声明通用方法返回枚举

来自分类Dev

枚举方法的通用返回类型

来自分类Dev

Java通用枚举作为参数