标签: enum-flags

通用枚举标志解析器

我有一个字符串值数组,我想在Flags Enum对象上设置标志.我有几个这样的,并且正在寻找一种更通用的方式来传递Flags枚举的类型,而不必为每个Flags Enum类型复制方法.这就是我目前所拥有的:

    public static MyFlagsEnum ParseFlagsEnum(string[] values)
    {
        MyFlagsEnum flags = new MyFlagsEnum();
        foreach (var flag in values)
        {
            flags |= (MyFlagsEnum)Enum.Parse(typeof(MyFlagsEnum), flag);
        }

        return flags;
    }
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种更通用的方法来做同样的事情,同时能够使用任何Flags Enum类型.

.net c# generics enums enum-flags

0
推荐指数
1
解决办法
796
查看次数

定义枚举标志值的惯例是什么?

假设我有以下代码:

[Flags]
enum MyFlags
{
    None = 0,
    A = 1,
    B = 2,
    C = 4,
    D = 8,
    E = 16,
    // ...
}
Run Code Online (Sandbox Code Playgroud)

当标志量变得非常大时,这显然不是最佳的.并通过最佳,平均可读,不快速或节省内存.

对于组合标志,例如

AB = 3
Run Code Online (Sandbox Code Playgroud)

我们可以轻松使用

AB = A | B
Run Code Online (Sandbox Code Playgroud)

相反,它更具可读性.
并用于组合所有标志

All = A | B | C | ...
Run Code Online (Sandbox Code Playgroud)

它会更有利于使用

All = ~None
Run Code Online (Sandbox Code Playgroud)

相反,即使我们没有充分利用所有可用的32/64位.

但是常规价值呢?

之间

E = 16
E = 0b10000
E = 0x10
E = 1 << 4
Run Code Online (Sandbox Code Playgroud)

或其他我没有想到的方法,哪种方式最适合大量的旗帜?

或者换句话说,在C#中为标志设置值的(商定的)约定是什么?

让我们假设为了论证,值不会对齐,所以代码可能看起来像这样

None = 0,
Apple = 1,
Banana = …
Run Code Online (Sandbox Code Playgroud)

c# enum-flags

0
推荐指数
1
解决办法
249
查看次数

如何从枚举值获取标志?

尝试从枚举值获取所有可能标志的数组,例如 3 到 {1, 2} 的数组。

我有一个扩展

internal static MyEnum[] GetFlags(this MyEnum modKey)
{            
    string[] splitStr = modKey.ToString().Split(new string[1] { ", " }, StringSplitOptions.RemoveEmptyEntries);

    MyEnum[] flags = new MyEnum[splitStr.Length];
    for (int i = 0; i < splitStr.Length; i++)
    {
        flags[i] = (MyEnum)Enum.Parse(typeof(MyEnum), splitStr[i]);
    }
    return flags;
}
Run Code Online (Sandbox Code Playgroud)

……但这似乎有点浪费。这可以更有效地完成吗?

c# enum-flags

0
推荐指数
1
解决办法
2925
查看次数

检查标志是否包含其他标志的任何值

我想比较两个标志,看看它们是否有共同的值。
我希望有一个扩展方法,以便“加速”编码(我将经常在各种枚举类型上使用它)。我怎么能够?
这段代码告诉我:

运算符“&”不能应用于 enum 和 enum 类型的操作数

public enum Tag
{
    Value1 = 1,
    Value2 = 2,
    Value3 = 4,
    Value4 = 8,
    Value5 = 16
}

public static class FlagExt
{
    public static bool HasAny(this Enum me, Enum other)
    {
        return (me & other) != 0;
    }
}

public class Program
{
    public static void Main()
    {
        Tag flag1 = Tag.Value1 | Tag.Value2 | Tag.Value3;
        Tag flag2 = Tag.Value2 | Tag.Value3 | Tag.Value4;
        
        Console.WriteLine(flag1.HasAny(flag2)); // it should returns …
Run Code Online (Sandbox Code Playgroud)

c# enums enum-flags

0
推荐指数
1
解决办法
761
查看次数

测试Flags Enum中是否只设置了一个位

所以我有一个标志枚举

public Enum test
{
   test1 = 1,
   test2 = 2,
   test3 = 4,
   etc.
}
Run Code Online (Sandbox Code Playgroud)

如何测试那一位,只设置一位?

我以前100%完成了这个,但是我的思绪不是这样的!

c# bit-manipulation enum-flags

-5
推荐指数
1
解决办法
2284
查看次数

标签 统计

c# ×5

enum-flags ×5

enums ×2

.net ×1

bit-manipulation ×1

generics ×1