Enums-所有选项值

问题描述 投票:23回答:8

是否有一种方法可以在枚举中添加“所有值”选项而不必每次将新值添加到枚举时都更改其值?

[Flags] 
public enum SomeEnum
{
    SomeValue =  1,
    SomeValue2 = 1 << 1,
    SomeValue3 = 1 << 2,
    SomeValue4 = 1 << 3,
    All = ?
}

更新:

最终结束了从长继承,并使用long.MaxValue作为“全部”选项。

c# enums bit-manipulation flags
8个回答
35
投票

由于您应该在诸如None = 0之类的标志枚举中定义空值,所以定义All值的最简单方法是简单地反转None中的所有位。

[Flags]
enum MyEnum
{
   None = 0,
   A = 1
   B = 2,
   C = 4,
   ...
   All = ~None
}

请注意,~0而不是~None不适用于无符号后备类型,因为它是-1,这对于无符号后备而言不是有效值

编辑:答案已修改为使用倒置的None而不是诸如0x7FFFFFFF或〜0之类的显式常量,因为这也适用于无符号


13
投票

应该是这样:

[Flags] 
public enum SomeEnum
{
    SomeValue =  1,
    SomeValue2 = 1 << 1,
    SomeValue3 = 1 << 2,
    SomeValue4 = 1 << 3,
    All = SomeValue | SomeValue2 | SomeValue3 | SomeValue4
}

4
投票

一个枚举可以由许多不同长度的整数类型(short,int,long)组成。这使得#FFFFFFFF解决方案不合适(如@MarcGravell注释中所指出)。

枚举可以由无符号类型(uint代表非整数)组成。这使-1解决方案不合适。

我最好的选择是,免维护:

All = ~0

3
投票

想法是使用枚举的行为来计算最后一个值。

在所有“真实”枚举值之后添加[[最后]]字段。添加

全部

字段等于(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查看我的博客以获取更多信息和想法。


2
投票
不,没有构建的东西可以使枚举更改时自动更新这种All选项。

0
投票
您可以使用一些技巧

0
投票
如果您可以使用单独类型的static readonly字段,而不是const枚举字段,则可以这样做:

0
投票
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; }
© www.soinside.com 2019 - 2024. All rights reserved.