c#中的负标志

本文关键字:标志 | 更新日期: 2023-09-27 17:48:57

嘿,有没有办法在c#中存储负标志?例如,我有以下代表一些样式的标志enum:

[Flags]
public enum Styles
{
    Default = 0,
    Bold = 1,
    Italic = 2
}

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

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

另一个是简单地定义两个字段,正面和负面标志,其中负面标志是在一个额外的字段中特别定义的,我通过简单地执行positiveFlags ^ negativeFlags来获得结果标志。

编辑:

如果这不是很清楚,我需要存储每个中间对象的样式。比如可以这样:

object1: Default
object2: Bold
object3: -Bold Italic

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

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

1: Bold
2: -Bold -Italic
3: Italic

2从之前的对象中消除了粗体和斜体,但随后不应再应用任何其他对象(尽管应该使用正值),因此最终值将再次为Italic

c#中的负标志

那么负号应该总是优先吗?如果您从NotBold开始,然后添加Bold呢?

如果出现时总是正的被负的覆盖,我建议使用两个字段:

private Styles baseStyles;
private Styles overrideDisableStyles;
public Styles ResultsStyles { return baseStyles & ~overrideDisableStyles; }

或者您可以使用SetStyleUnsetStyle创建一个助手类:

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

作为参考,positiveFlags ^ negativeFlags将不工作。考虑没有设置Bold而设置了NotBold的情况。结果将是Bold,即使唯一指定的标志是NotBold

最后,如果你正在做任何商业的、深入的、比你在这里描述的更复杂的事情,并且想要有可扩展/可扩展的风格继承,你应该用对象图/类层次结构来正确地设计它——从定义一个有一个或多个父对象的Style类开始。每个Style都可以有一组属性名/值对,这些属性名/值对覆盖来自父类的任何内容——可以有一个返回这些覆盖的Properties集合,以及一个从根对象开始并导航到所讨论的样式的Evaluate方法,构建一个结果属性列表供您使用。

希望对你有帮助。

我建议采用第二种方法。

另一个是简单地定义两个字段,正面和负面标志,其中负面标志是在一个额外的字段中特别定义的,我通过简单地执行positiveFlags ^ negativeFlags来获得结果标志。

这对我来说似乎是最自然的(除了表达式应该读positiveFlags & ~negativeFlags)。此外,它还提供了一种应用继承样式的简单方法。如果我们重写你的例子

1: Bold
2: -Bold -Italic
3: Italic 

as(无特定语法…)

1: pos:{ Bold }   neg:{ none }
2: pos:{ none }   neg:{ Bold Italic }
3: pos:{ Italic } neg:{ none }

则有效样式以(prevLevelStyle | pos) & ~neg继承计算,结果为:

1: ({ none } | { Bold })   & ~{ none }        = { Bold }
2: ({ Bold } | { none })   & ~{ Bold Italic } = { none }
3: ({ none } | { Italic }) & ~{ none }        = { Italic }

如果我没弄错的话,你不需要定义负标志,而是使用"正"标志来取消它们的设置。

例如,以下代码可用于取消设置粗体标志

Styles styles = Styles.Bold | Styles.Italic;
styles = styles ^ Styles.Bold;