二元运算非常有用。这样我可以这样做 | ^ &
,以便 ro 发出一个新序列。
但是,有时有些Enum
's 没有base 2
附加值(或根本没有值)。
IE:
我想Enhance || derive|| attach
为每个条目赋予枚举(如果可能)的值。
所以我将能够做到:
if (MyListItemType== Header |Footer ) ...
是否可以 ?还是有任何棘手的解决方法?
我要加强 || 导出|| 将值附加到每个条目的枚举(如果可能)。
你不能这样做(没有重新定义枚举)。但是当它在你不拥有的代码中时,它就结束了。可能已经存在依赖编号的代码,更改 int 值会破坏该代码。
但这通常意味着 Enum 并非旨在设置位,因此尝试将其用作一个位可能无论如何都不是一个好主意。
这是代码创建者的设计决策。
查看您的示例列表:
var item = ListItemType.Header | ListItemType.Footer | ListItemType.SelectedItem;
真的可以item
同时是页眉、页脚和选中项吗?这是一个互斥选项列表。
您想使用标志枚举:
[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;
}
不,你不能。
如果 anEnum
没有标记FlagsEnumeration
和/或具有正确的位掩码值(如您所说 - “没有 base2”),则不能对其使用按位运算来获得有意义的结果。
正如其他人所说,它无法完成,但我将使用扩展方法的快捷方式:
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);
这几乎是您想要实现的目标。
您正在寻找标志枚举:http: //msdn.microsoft.com/en-us/library/cc138362.aspx
[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
然后,您可以对它们使用按位运算符。