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
。
那么负号应该总是优先吗?如果您从NotBold
开始,然后添加Bold
呢?
如果出现时总是正的被负的覆盖,我建议使用两个字段:
private Styles baseStyles;
private Styles overrideDisableStyles;
public Styles ResultsStyles { return baseStyles & ~overrideDisableStyles; }
或者您可以使用SetStyle
和UnsetStyle
创建一个助手类:
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;