1

二元运算非常有用。这样我可以这样做 | ^ &,以便 ro 发出一个新序列。

但是,有时有些Enum's 没有base 2附加值(或根本没有值)。

IE:

在此处输入图像描述

我想Enhance || derive|| attach为每个条目赋予枚举(如果可能)的值。

所以我将能够做到:

if (MyListItemType== Header |Footer ) ...

是否可以 ?还是有任何棘手的解决方法?

4

6 回答 6

10

我要加强 || 导出|| 将值附加到每个条目的枚举(如果可能)。

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

但这通常意味着 Enum 并非旨在设置位,因此尝试将其用作一个位可能无论如何都不是一个好主意。

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

查看您的示例列表:

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

真的可以item同时是页眉、页脚和选中项吗?这是一个互斥选项列表。

于 2012-04-04T11:37:03.613 回答
5

您想使用标志枚举:

[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;
}
于 2012-04-04T11:35:46.400 回答
4

不,你不能。

如果 anEnum没有标记FlagsEnumeration和/或具有正确的位掩码值(如您所说 - “没有 base2”),则不能对其使用按位运算来获得有意义的结果。

于 2012-04-04T11:37:46.320 回答
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);

几乎是您想要实现的目标。

于 2012-04-04T11:55:59.083 回答
0

您正在寻找标志枚举:http: //msdn.microsoft.com/en-us/library/cc138362.aspx

于 2012-04-04T11:36:29.807 回答
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

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

于 2012-04-04T11:36:46.783 回答