基于布尔值更改标志

时间:2011-08-05 15:12:40

标签: c# enums binary flags

有没有更优雅的方式这样做?

[Flags]
public enum SomeFlaggedEnum
{
    Value1 = 1,
    Value2 = 2,
    Value3 = 4
}


private SomeFlaggedEnum _myFlags;

public bool EnabledValue1
{
    set 
    {
        if (value)
        {
            _myFlags |= SomeFlaggedEnum.Value1;
        }
        else
        {
            _myFlags &= ~SomeFlaggedEnum.Value1;
        }
    }
} 

我知道可能有一个简单的答案,我只是在想它...

编辑:如其中一个答案所指出的,枚举是不正确的。这只是在这个例子中,而不是在实际的代码中。

5 个答案:

答案 0 :(得分:7)

我的意思是,你可以这样做:

_myFlags = value ? myFlags | SomeFlaggedEnum.Value1 : myFlags & ~SomeFlaggedEnum.Value1;

但我认为你的解决方案很好。

答案 1 :(得分:6)

好吧,你可以使用条件:

_myFlags = value ? _myFlags | SomeFlaggedEnum.Value1
                 : _myFlags & ~SomeFlaggedEnum.Value1;

答案 2 :(得分:2)

你的二传手很好。

问题是使用FlagsAttribute不会使编译器选择有用的值来将枚举成员用作标志。 SomeFlaggedEnum.Value1为零,因为它是枚举中第一个声明的值,因此它根本不代表一个标志。

尝试

[Flags]
public enum SomeFlaggedEnum
{
    Value1 = 1,
    Value2 = 2,
    Value3 = 4
}

答案 3 :(得分:2)

如果你有一个每个标志的属性来设置它,看起来它会变得非常难看,假设你有超过3个标志。如果你能说出要设置哪些标志的单一方法会不会更容易?

public void EnableFlag(SomeFlaggedEnum value, bool set) {
    _myFlags = set ? value | _myFlags : ~value & _myFlags;
}

EnableFlag(SomeFlaggedEnum.Value1, true);

答案 4 :(得分:1)

为标志创建一个通用的setter(在Enum类中已经有一个通用的“HasFlag”,但像这样的扩展将补充它。

public static class EnumExtensions
{
    public static T SetFlags<T>(this T value, T flags, bool on) where T : struct
    {    
        long lValue = Convert.ToInt64(value);
        long lFlag = Convert.ToInt64(flags);
        if (on)
        {
            lValue |= lFlag;
        }
        else
        {
            lValue &= (~lFlag);
        }
        return (T)Enum.ToObject(typeof(T), lValue);
    }
}

一旦你有了这个,就可以为每个标志创建属性(但很快就会变得混乱),或者只是将获取和设置标志委托给HasFlag / SetFlag