C#中的否定标志

pok*_*oke 8 c# enums flags

嘿,有没有办法在C#中存储负面标志?例如,我有以下标志枚举代表一些样式:

[Flags]
public enum Styles
{
    Default = 0,
    Bold = 1,
    Italic = 2
}
Run Code Online (Sandbox Code Playgroud)

现在我有多个对象,可以应用这些样式,然后将所有相关组合起来(即其他对象可以继承一些以前设置的样式).除此之外,我想定义负面标志,基本上撤消继承的样式.因此,如果先前将样式设置为Styles.Bold | Styles.Italic并且对象继承了该样式但Styles.Bold设置了负标志,则结果应该是正确的Styles.Italic.

是否有任何机制已经这样做了?我现在基本上有两种方式:首先是定义NotXY枚举值,然后以某种方式解析以消除XY设置时的值.

另一个是简单地定义两个字段,正标志和负标志,其中负标志是在额外字段中专门定义的,我通过简单的方式得到结果标志positiveFlags ^ negativeFlags.

编辑:

如果不清楚,我需要存储每个中间对象的样式.所以它可能是这样的:

object1: Default
object2: Bold
object3: -Bold Italic
Run Code Online (Sandbox Code Playgroud)

如果object3也继承了1和2的值,那么最终结果应该是正确的Italic.

回答Kieren Johnstone的问题的另一个例子,并且根据我在评论中的陈述,负值仅适用于当前级别:

1: Bold
2: -Bold -Italic
3: Italic
Run Code Online (Sandbox Code Playgroud)

2从先前的对象中消除了Bold和Italic,但是不应该再应用任何进一步的(正值应该),因此最终值将Italic再次出现.

Kie*_*one 9

那么否定总是有优先权吗?如果你从a开始NotBold然后添加一个Bold怎么办?

如果在出现时总是被负数覆盖,我会建议两个字段:

private Styles baseStyles;
private Styles overrideDisableStyles;
public Styles ResultsStyles { return baseStyles & ~overrideDisableStyles; }
Run Code Online (Sandbox Code Playgroud)

或者您可以使用SetStyle和创建一个辅助类UnsetStyle:

public void SetStyle(Styles styles)
{
    this.styles |= styles;
}

public void UnsetStyle(Styles styles)
{
    this.styles &= ~styles;
}
Run Code Online (Sandbox Code Playgroud)

供参考,positiveFlags ^ negativeFlags不起作用.考虑Bold未设置的情况,但是NotBold.结果将是Bold唯一指定的标志NotBold.

最后,如果您正在做任何商业,深入,比您在此描述的更复杂并希望具有可扩展/可扩展样式继承的任何内容,您应该使用对象图/类层次结构正确设计它 - 首先定义一个Style类有一个或多个父对象.每个都Style可以有一组属性名称/值对,它们覆盖来自父级的任何内容 - 可能有一个Properties返回这些覆盖的集合,以及一个Evaluate从根对象开始并导航到相关样式的方法,构建一个结果列表您可以使用的属性.

希望有所帮助.