C#中的枚举成员联盟

时间:2016-07-24 03:02:06

标签: c# enums grouping

我们说,我有一个OS X,其定义如下:

g++ -Wall readSBML.cpp -o readSBML.exe /usr/local/lib/libsbml.5.dylib

BasicType标识执行任何enum BasicType的三元分类。随后,我意识到对象 A B 需要以与 C 相比的方式进行处理,因此我定义了另一个{{ 1}}如下:

    public enum ObjectType{
        A = 1,
        B = 2,
        C = 3,
    }

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

修改1 :我无法找到问题here

的相似之处

编辑2 :谢谢Maurice的建设性意见 - 从你的答案中获取线索,我想出了这个重新定义的enum ObjectGroupType

public enum ObjectGroupType
{
   AB = 1,
   C = 2,
}

这有效吗?

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

ObjectGroupType

3 个答案:

答案 0 :(得分:4)

如果我误读了你的意图,我会提前道歉,但这听起来好像你想让你的代码根据枚举值允许多种不同的枚举类型。好处是你可以通过按位操作和枚举来完成。

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

[Flags]
enum ObjectType
{
    A = 1,
    B = 2,
    C = 4,
    D = 8
}

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

var allowedValues = ObjectType.A | ObjectType.C;

这是有效的,因为枚举中的值就像封面下的位字段一样。

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

if ((test & allowed) == test) ...

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

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

祝你好运!

答案 1 :(得分:0)

您可以使用int而不是枚举,使用组合时不重叠的值(即二进制表示只有一位的值),然后对参数的ObjectType执行掩码操作以确定如果是AB:

Router.route('/admin', {
    action: function() {
    if(Roles.userIsInRole(Meteor.user(), ['admin'])) {
        this.render('admin') }
        else
        this.render('denied')
        }
    });

这种方法的缺点是失去了对象类型的强类型,即您可以分配任何值,而不仅仅是您在ObjectType中定义的值。

答案 2 :(得分:0)

编辑:

我发现Maurice Reeves的答案非常好,我只想提供更多信息:

   [Flags]
    public enum ObjectType
{
    None=0,
    A = 1,
    B = 2,
    C = 4,
    D = 8,
    E = 16,
    AorB=A|B,
    BorCorD=B|C|D,

}

通过使用[Flags]属性,您可以创建枚举项集,这可以帮助您为每个集建立不同的业务规则。

为了检查集合中是否存在和项目,您可以执行以下操作:

public static bool IsAorB(this ObjectType item)
{
      return ObjectType.AorB.HasFlag(item);
}

如果你想动态创建一组新项目,你可以这样做:

var newGroup=ObjectType.A | ObjectType.BorCorD;

如果您想将某些业务规则应用于集合(项目除外),您可以执行以下操作:

var newGroupExceptC =newGroup^=ObjectType.C;

现在,如果你检查集合中是否存在元素C,你将得到错误:

bool exist=newGroupExceptC.HasFlag(ObjectType.C) // =false

您可以找到here

的更多信息