2011-08-05 85 views
3

有没有更好的方法来做到这一点?根据布尔值更改标志

[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; 
     } 
    } 
} 

我知道有可能是一个简单的答案,我只是这样思前想...

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

+0

看起来不错我。 –

+0

看看这个http://stackoverflow.com/questions/5850873/enum-hasflag-why-no-enum-setflag – Vasea

+0

三元运算符而不是设置属性呢? – 2011-08-05 15:15:18

回答

5

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

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

但我认为您的解决方案是好的。

5

嗯,你可以使用条件:

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

你的二传手很好。

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

尝试

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

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

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

EnableFlag(SomeFlaggedEnum.Value1, true); 
1

作出标志通用二传手(已存在的枚举类通用的“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