2011-08-05 114 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