是否有一种方法可以在枚举中添加“所有值”选项而不必每次将新值添加到枚举时都更改其值?
[Flags]
public enum SomeEnum
{
SomeValue = 1,
SomeValue2 = 1 << 1,
SomeValue3 = 1 << 2,
SomeValue4 = 1 << 3,
All = ?
}
更新:
最终结束了从长继承,并使用long.MaxValue
作为“全部”选项。
由于您应该在诸如None = 0
之类的标志枚举中定义空值,所以定义All
值的最简单方法是简单地反转None
中的所有位。
[Flags]
enum MyEnum
{
None = 0,
A = 1
B = 2,
C = 4,
...
All = ~None
}
请注意,~0
而不是~None
不适用于无符号后备类型,因为它是-1,这对于无符号后备而言不是有效值
编辑:答案已修改为使用倒置的None而不是诸如0x7FFFFFFF或〜0之类的显式常量,因为这也适用于无符号
应该是这样:
[Flags]
public enum SomeEnum
{
SomeValue = 1,
SomeValue2 = 1 << 1,
SomeValue3 = 1 << 2,
SomeValue4 = 1 << 3,
All = SomeValue | SomeValue2 | SomeValue3 | SomeValue4
}
一个枚举可以由许多不同长度的整数类型(short,int,long)组成。这使得#FFFFFFFF
解决方案不合适(如@MarcGravell注释中所指出)。
枚举可以由无符号类型(uint代表非整数)组成。这使-1
解决方案不合适。
我最好的选择是,免维护:
All = ~0
想法是使用枚举的行为来计算最后一个值。
在所有“真实”枚举值之后添加[[最后]]字段。添加 全部(Last << 1) - 3
。[Flags]
public enum SomeEnum
{
SomeValue = 1,
SomeValue2 = 1 << 1,
SomeValue3 = 1 << 2,
SomeValue4 = 1 << 3,
// Do not add values after this
Last,
All = (Last << 1) - 3,
}
我在How to use Enum with aditional options (All, None)回答了
您可以在Enum Trick查看我的博客以获取更多信息和想法。
All
选项。static readonly
字段,而不是const
枚举字段,则可以这样做:public static T EnumSetAll<T>() where T : struct, Enum
{
string str = string.Join(", ", Enum.GetNames(typeof(T)));
if (Enum.TryParse<T>(str, out var e))
return e;
return default;
}