c# - C# 中的负标志

标签 c# enums flags

嘿,有没有办法在 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; }

或者您可以使用 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 方法,该方法从根对象开始并导航到相关样式,构建结果属性列表供您使用。

希望对您有所帮助。

关于c# - C# 中的负标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5537078/

相关文章:

java - 具有ManyToMany关系的JPA枚举实体

linux - 如何处理名称为标志的文件

c# - 如何查询在 NHibernate 中存储为枚举的标志

c - 如何制作makefile?

c# - 设置 _NO_DEBUG_HEAP

c# - 使用 WCF 从 Silverlight 传递列表

c# - SpecFlow:场景大纲示例

java - 用于枚举接口(interface)的 Spring @ResponseBody 和 Jackson JsonSerializer

java - 为什么 Java 枚举不可克隆?

c# - 如何在 xamarin.forms 中读取图像源或图像名称?