C#中枚举成员的联合

env*_*nce 1 c# enums grouping

假设我有一个enum BasicType,其定义如下:

    public enum ObjectType{
        A = 1,
        B = 2,
        C = 3,
    }
Run Code Online (Sandbox Code Playgroud)

BasicType 标识执行任何 的三元分类Object。随后,我意识到对象AB需要以与C类似的方式处理,因此我定义了另一个enum ObjectGroupType如下:

public enum ObjectGroupType
{
   AB = 1,
   C = 2,
}
Run Code Online (Sandbox Code Playgroud)

使用新的枚举,我可以将几种已知类型的对象归为一个。因此,当我收到各种类型的对象流时,我实际上会识别它们是属于 AB 类型还是 C 类型。有没有优雅的解决方法?例如,我能否为 A 和 B 中的 A 和 B 分配相同的枚举值ObjectGroupType?:

编辑1:我无法找到相似的问题在这里

编辑 2:感谢 Maurice 的建设性意见——从你的回答中得到提示,我想出了这个重新定义的ObjectGroupType.

 public enum ObjectGroupType
 {
    AB = ObjectType.A | ObjectType.B
    C = 2,
 }
Run Code Online (Sandbox Code Playgroud)

这是有效的吗?

本质上,当我处理类型为 AB 的对象流时,我想确定类型 A 或类型 B 对象。这与分层的两级决策树非常相似:

    object
    /     \
 AB        C
 /\
A  B
Run Code Online (Sandbox Code Playgroud)

Mau*_*ves 5

如果我误读了您的意图,我提前道歉,但听起来您几乎想允许根据枚举值在代码中处理多种不同的枚举类型。好消息是您已经可以使用按位运算和枚举来做到这一点。

给定一个看起来像这样的枚举:

[Flags]
enum ObjectType
{
    A = 1,
    B = 2,
    C = 4,
    D = 8
}
Run Code Online (Sandbox Code Playgroud)

您可以设置一个比较值,该值是多个值的按位或:

var allowedValues = ObjectType.A | ObjectType.C;
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为枚举中的值就像幕后的位字段。

当您运行代码时,您对 allowedValues 变量和测试变量进行按位 AND 运算,看看它是否与您的测试变量匹配。如果是,那么它就是您想要的值之一:

if ((test & allowed) == test) ...
Run Code Online (Sandbox Code Playgroud)

下面是一个使用上面枚举的工作示例,向您展示了它是如何工作的。

void Main()
{
    var allowed = ObjectType.A | ObjectType.C;

    var values = new int [] { 1, 2, 4, 8 };

    foreach (var i in values)
    {
        var test = (ObjectType)i;

        if ((test & allowed) == test)
        {
            Console.WriteLine("Found a match: {0}", test);
        }
        else
        {
            Console.WriteLine("No match: {0}", test);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

祝你好运!