标签: enum-flags

将标志传递给对象的正确设计模式

在 C 我做过这种事情

enum { USE_COKE = 1,
        USE_PEPSI = 2,
        USE_JUICE = 4,
        USE_WATER = 8 };

 int makeDrink(int flags);

 //...

 int rcode = makeDrink(USE_COKE | USE_JUICE | USE_WATER);
Run Code Online (Sandbox Code Playgroud)

我知道这是非常标准的,它也用于iostream例如。我想知道如何将这种设计模式翻译成 Java 或 OOP?我确定多态性不是这里的方法,因为我的代码有一个if(flag_is_set)块比重写大部分例程更好。是否有实用程序Flags类,或使用配置对象、一个enum或一堆整数等执行此操作的首选方法。

java oop design-patterns enum-flags

2
推荐指数
1
解决办法
1735
查看次数

C#中的"| ="运算符是什么?

在研究错误的原因时,我遇到了这行代码:

Status |= (int)states.Reading;
Run Code Online (Sandbox Code Playgroud)

C#中的"| ="运算符是什么?

因此"状态"定义如下:

public static int Status 
Run Code Online (Sandbox Code Playgroud)

...使用存取器和mutator(或"getter"和"setter"),而"states"以这种方式定义:

[Flags]
public  enum states
Run Code Online (Sandbox Code Playgroud)

c# windows-ce nullreferenceexception enum-flags

2
推荐指数
1
解决办法
167
查看次数

如何将int值转换为列出Flag枚举的int值

萨拉姆.我有这个标志枚举:

public enum DataAccessPoliceis
{
      None = 0,
      A = 1,
      B = 2,
      C = 4, 
      D = 8, 
      E = B | C | D, // 14
      All = A | E // 15
}
Run Code Online (Sandbox Code Playgroud)

我想从int值获取int值(或复杂枚举项的int值列表):

int x = 9; // enum items => D | A
List<int> lstEnumValues = ???
// after this line ...
// lstEnumValues = { 1, 8 }
// and for x = 15
// lstEnumValues = { 1, 2, 4, 8, 14, …
Run Code Online (Sandbox Code Playgroud)

c# enums enum-flags

2
推荐指数
2
解决办法
3539
查看次数

使用LINQ选择枚举中的所有标记值

我有一组标记的枚举,如下所示:

[Flags]
enum EnumThing
{
    A = 1,
    B = 2,
    C = 4,
    D = 8
}
Run Code Online (Sandbox Code Playgroud)

我想使用LINQ选择集合中的所有标志。假设集合是这样的:

EnumThing ab = EnumThing.A | EnumThing.B;
EnumThing ad = EnumTHing.A | EnumThing.D;    
var enumList = new List<EnumThing> { ab, ad };
Run Code Online (Sandbox Code Playgroud)

按位显示如下:

0011
1001
Run Code Online (Sandbox Code Playgroud)

预期的结果是这样的:

1011
Run Code Online (Sandbox Code Playgroud)

可以通过以下代码在普通C#中实现所需的结果:

EnumThing wishedOutcome = ab | ad;
Run Code Online (Sandbox Code Playgroud)

或在SQL中

select 3 | 9
Run Code Online (Sandbox Code Playgroud)

但是,如何在enumList使用Linq的过程中选择所有选中的标志EnumThing

c# linq enums enum-flags

2
推荐指数
1
解决办法
555
查看次数

测试多个标志值

我有这个标志枚举:

public enum AssignmentType
{
    None = 0,
    Attendant = 1,
    ConductorCBS = 2,
    ReaderCBS = 4,
    Chairman = 8,
    Mike = 16,
    PlatformAttendant = 32,
    Prayer = 64,
    OCLM = 128,
    Sound = 256,
    Student = 512,
    Custom = 1024,
    Demonstration = 2048,
    Assistant = 4096
}
Run Code Online (Sandbox Code Playgroud)

我现在想测试我的变量是否有特定的标志条件。

我想确定我的变量只是以下各项的任意组合

  • None
  • Student
  • Assistant
  • Demonstration

因此,如果它具有任何其他枚举值,则该变量将无法满足测试要求。

首先,我从这里开始:

bool bIsPersonnel = true;

if (_Assignments == AssignmentType.None ||
    _Assignments == AssignmentType.Demonstration || 
    _Assignments == AssignmentType.Student ||
    _Assignments == AssignmentType.Assistant ||
    _Assignments …
Run Code Online (Sandbox Code Playgroud)

c# enum-flags

2
推荐指数
1
解决办法
102
查看次数

检查枚举标志是否包含某个标志值

在 C# 中(使用 Unity 处理游戏)我有一个带有 [Flag] 属性的枚举。我已经实例化了两次。我想要一种比较两个枚举的方法。特别是如果 enum A(将有多个标志)包含来自 enum B 的标志(它只会被分配一个标志)。

不想将单个实例化的枚举与单个标志进行比较(这已被多次回答)。

我怀疑我可以通过使用 GetValue 转储值并在 foreach 循环中比较这些值来做到这一点,但似乎应该有更直接的比较方法。

public enum AbilityType
{
    None = 0,
    Pierce = 1<<1,
    Blunt = 1<<2,
    Slash = 1<<3,
    Water = 1<<4,
    // etc.
};


public class Ability : MonoBehaviour
{
    public AbilityType abilityType;
}
Run Code Online (Sandbox Code Playgroud)

public class AbilitiedObject : StatisticalObject
{
    public AbilityType resistances;

    protected override void Awake()
    {
        base.Awake();
        resistances = AbilityType.Pierce | AbilityType.Water;
    }

    public void TakeDamage(int damageAmount, AbilityType abilityType)
    { …
Run Code Online (Sandbox Code Playgroud)

c# enums unity-game-engine enum-flags

2
推荐指数
1
解决办法
4456
查看次数

将枚举的每个值绑定到复选框 Blazor

我有一个 [Flags] 枚举,其中包含我想要收集的一些数据点。我的目标是将每个值(每个位)显示并绑定为单独的复选框以供用户检查。但是,我不知道如何将 Flags 枚举的各个值绑定到组件,也不知道是否可能。为了更好地解释我的观点:

说这是我的枚举:

[Flags]
public enum DataPoints{
     Large = 1,
     Soft  = 2,
     Green = 4,
     Round = 8
}
Run Code Online (Sandbox Code Playgroud)

然后我希望表单的 DataPoints 类型模型中有一个可以保存这些值的属性:

//possible data points like:
// 9: Round and Large
// 6: Soft and Green
public DataPoints Data;
Run Code Online (Sandbox Code Playgroud)

我在想类似以下的内容,但我认为您不能将枚举的各个值/位绑定到这样的组件:

@foreach (DataPoints datum in Enum.GetValues(typeof(DataPoints)))
   {
      <CheckBox @bind-Value="what? Data.datum?"></CheckBox>
   }
Run Code Online (Sandbox Code Playgroud)

c# enums enum-flags blazor .net-5

2
推荐指数
1
解决办法
2102
查看次数

为什么在C#中没有为标志枚举实现运算符<<和>>?

我想做这样的事,但我不能:

[Flags]
enum SomeEnum : int
{ 
 None = 0,
 A,
 B,
 C
}

SomeEnum en = SomeEnum.A;
en <<= 1; //Expect en == SomeEnum.B but I recieve an error here
Run Code Online (Sandbox Code Playgroud)

为了做到这一点?

.net c# enums enum-flags

1
推荐指数
1
解决办法
156
查看次数

CA1008:枚举应具有零值和标志枚举

即使我完全知道CA1008警告存在的原因,我也不知道在下列情况下如何避免它.我有一个具有以下含义的Flag枚举:

ValidValue = 0x01
WrittenValue = 0x02
Run Code Online (Sandbox Code Playgroud)

所以在这种情况下,0表示InvalidValueNonWritten而不是None.规则

除了先前已发布的标记属性枚举之外,请勿禁止此规则发出警告.

在这种情况下,我没有发送枚举,所以如何防止此警告?

编辑:

警告明确说:

警告86 CA1008:Microsoft.Design:在枚举"XXX"中,将"XXX.InvalidValueNonWritten"的名称更改为"无".

编辑2:

枚举的更多状态:

CommandValue = 0x04 // Otherwise it is DataValue
InmediateValue = 0x08 // Otherwise it is Deferred
Run Code Online (Sandbox Code Playgroud)

.net c# enums fxcop enum-flags

1
推荐指数
1
解决办法
1238
查看次数

在c#中获取公共标志枚举值

说我有以下枚举

[Flags]
enum Letters
{
     A = 1,
     B = 2,
     C = 4,
     D = 8,
     E = 16,
     F = 32,
     AB = A | B,
     All = A | B | C,
}
Run Code Online (Sandbox Code Playgroud)

如果我有变量:

var s = Letters.A | Letters.B | Letters.D;
var p = Letters.A | Letters.C | Letters.D | Letters.E;
Run Code Online (Sandbox Code Playgroud)

我想要的是获得这两个枚举之间的共同值,所以在这种情况下它应该是A | D.有人可以告诉我如何实现这一目标.

谢谢

c# enums enum-flags

1
推荐指数
1
解决办法
118
查看次数