2014-08-28 100 views
0

有沒有一種方法可以組合Enum中的標誌,但限制可能的組合? 我有一個枚舉這樣的:限制標誌的可能組合

[Flags] 
public enum CopyFlags 
{ 
    /// <summary> 
    /// Copy members regardless of their actual case 
    /// </summary> 
    CaseSensitive = 1, 
    /// <summary> 
    /// Indicates if a leading underscore (e.g. _myMember) should be ignored while comparing member-names. 
    /// </summary> 
    IgnoreLeadingUnderscore = 2, 
    /// <summary> 
    /// Indicates if only properties should be copied. Usefull when all technical data is stored in properties. 
    /// </summary> 
    PropertiesOnly = 4 
} 

現在我也想引進FieldsOnly - 值,但確保它只是用來當PropertiesOnly不存在。這可能嗎?

+0

不,沒有什麼可以防止這種情況。即使'(CopyFlags)12345'也是有效的。 – leppie 2014-08-28 13:03:36

回答

3

不,這是不可能的。甚至無法將這些值限制爲列出的項目。例如,下面是允許在C#:

CopyFlags flags = (CopyFlags)358643; 

您需要執行的,其中包括一個CopyFlags參數的方法裏面明確您的驗證。

+0

所以我應該引入FieldsOnly 8的值,然後檢查屬性和字段,對吧? – HimBromBeere 2014-08-28 13:15:18

1

不,在枚舉的上下文中是不可能的;相反,你必須驗證它:

public void DoSomething(CopyFlag flag) 
{ 
    if (flag.HasFlag(CopyFlags.PropertiesOnly) && flag.HasFlag(CopyFlags.FieldsOnly)) 
     throw new ArgumentException(); 

} 
+0

悲傷這可能只適用於.NET 4.0以上:( – HimBromBeere 2014-08-28 13:10:22

+0

然後使用((Flag&CopyFlags.PropertiesOnly)== CopyFlags.PropertiesOnly或(flag&CopyFlags.FieldOnly)== CopyFlags.FieldOnly'。該方法是一個快捷方式。 – 2014-08-28 14:06:03