2014-08-28 111 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