增强C#Enum以使用Bitwise操作?

时间:2012-04-04 11:33:54

标签: c# .net .net-4.0 enums

二进制操作非常有用。通过这种方式,我可以| ^ &按顺序发出新的序列。

但是,有时会有Enum个附加base 2值的Enhance || derive|| attach (或根本没有价值)。

即:

enter image description here

我希望每个条目的if (MyListItemType== Header |Footer ) ... 值为Enum(如果可能)。

所以我可以这样做:

{{1}}

有可能吗?或者是否有任何棘手的工作?

6 个答案:

答案 0 :(得分:8)

  

我想加强||获得||将值附加到每个条目的枚举(如果可能)。

你不能这样做(没有重新定义枚举)。但是当它在代码中你没有拥有时,就结束了。已经存在依赖于编号的代码,更改int值会破坏该代码。

但这通常意味着Enum不是一个有点集,所以试图将它作为一个可能并不是一个好主意。

这是代码创建者的设计决策。

查看您的示例列表:

var item = ListItemType.Header | ListItemType.Footer | ListItemType.SelectedItem;

item可以同时成为页眉,页脚和所选项吗?这是一个互斥选项列表。

答案 1 :(得分:5)

您想使用flags枚举:

[Flags]
enum Days2
{
    None = 0x0,
    Sunday = 0x1,
    Monday = 0x2,
    Tuesday = 0x4,
    Wednesday = 0x8,
    Thursday = 0x10,
    Friday = 0x20,
    Saturday = 0x40
}
class MyClass
{
    Days2 meetingDays = Days2.Tuesday | Days2.Thursday;
}

答案 2 :(得分:4)

不,你不能。

如果Enum未标记FlagsEnumeration和/或具有正确的位掩码值(正如您所说 - “没有base2”),则不能使用按位对其进行操作以获得有意义的结果。

答案 3 :(得分:3)

正如其他人所说,无法完成,但我将使用扩展方法的快捷方式:

public enum MyEnum
    {
        This,
        That,
        TheOther
    }

    public static class MyEnumeExtensions
    {
        public static bool IsAny(this MyEnum enumValue, params MyEnum[] values)
        {
            return values.Any((e) => e == enumValue);
        }
    }

所以我可以使用:

myEnum.IsAny(This, That);

几乎您希望实现的目标。

答案 4 :(得分:0)

答案 5 :(得分:0)

[Flags]
enum Days2
{
    None = 0x0,
    Sunday = 0x1,
    Monday = 0x2,
    Tuesday = 0x4,
    Wednesday = 0x8,
    Thursday = 0x10,
    Friday = 0x20,
    Saturday = 0x40
}

http://msdn.microsoft.com/en-us/library/cc138362.aspx

然后,您可以在它们上使用按位运算符。