嘿,有没有办法在 C# 中存储负标志?例如,我有以下代表某些样式的标志枚举:
[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
方法,该方法从根对象开始并导航到相关样式,构建结果属性列表供您使用。
希望对您有所帮助。
关于c# - C# 中的负标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5537078/