2013-03-27 72 views
0

我有我寫它是基於枚舉的標誌自定義控件的屬性。我創建了自己的自定義控件,以一種合理的方式編輯它,並從我自己的UITypeEditor中調用它。問題是,當我嘗試存儲的值是標誌的組合時,Visual Studio會生成一個錯誤,告訴我該值無效。一個或運算枚舉UITypeEditor的

實施例:

public enum TrayModes 
{ 
    SingleUnit = 0x01 
    , Tray = 0x02 
    , Poll = 0x04 
    , Trigger = 0x08 
}; 

如果我想保存的值是SingleUnit | Trigger生成的值是9。這反過來又創造如下錯誤:

Code generation for the property 'TrayMode' failed. Error was: 'The value '9' is not valid for the enum 'TrayModes'.'

回答

0
You have to add [Flags] before your enum declaration 

[Flags] 
public enum TrayModes 
{ 
    SingleUnit = 0x01 
    , Tray = 0x02 
    , Poll = 0x04 
    , Trigger = 0x08 
}; 

考慮使用HasFlag功能檢查設置好的標誌

TrayModes t=TrayModes.SingleUnit|TrayModes.Poll; 
if(t.HasFlag(TrayModes.SingleUnit)) 
//return true 

編輯: 這是因爲枚舉用標誌屬性都以不同的方式threated, 你可以看到的例子在http://msdn.microsoft.com/en-us/library/system.flagsattribute.aspx A在有和沒有標誌枚舉的字符串屬性顯示它們是如何不同

的值的所有可能的組合枚舉沒有的FlagsAttribute:用的FlagsAttribute的 枚舉值的

0 - Black 
    1 - Red 
    2 - Green 
    3 - 3 
    4 - Blue 
    5 - 5 
    6 - 6 
    7 - 7 
    8 - 8 

所有可能的組合:

0 - Black 
    1 - Red 
    2 - Green 
    3 - Red, Green 
    4 - Blue 
    5 - Red, Blue 
    6 - Green, Blue 
    7 - Red, Green, Blue 
    8 - 8 
+0

我已經注意到這一點,買爲什麼我要加嗎?示例代碼中的集合沒有這個屬性,但是我產生了一個錯誤。此外,我沒有'HasFlag'方法,我在C#2.0 – Fr33dan 2013-03-27 16:02:22

+0

是它改變了'ToString'的結果,但如果你看看那個例子中,你甚至可以看到的任何值仍然是枚舉的有效值,而不標誌屬性。否則,你會在'ToString'之前產生一個錯誤。任何'int'都應該是一個有效的值。 – Fr33dan 2013-03-27 17:26:38

0

使用Flags屬性上枚舉將防止錯誤發生。對我來說,這是一個謎,因爲存儲沒有標誌的ORed枚舉是有效的,並且可以在代碼中完成(通過適當的轉換)。