繁体   English   中英

用Flags扩展枚举,干扰当前使用

[英]Extending enum with Flags, interfere the current use

系统有一个简单的枚举,例如

public enum SomeEnum : short
{ 
    Ok = 0,
    Missing = 17,
};

现在,该枚举陷入了一种情况,我需要在不更改现有枚举值的外观的情况下将更多信息屏蔽掉。 枚举将获得一些新的价值,

[Flags]
public enum SomeEnum : short
{ 
    Ok = 0,
    Missing = 17,
    Blocking = 18, // Values could be anything
    Low  = 19,     // Values could be anything
};

我担心当前的枚举用法可能会出现问题。 看来我是对的,但希望您的帮助能证明我错了 直到今天的用法都是围绕SomeEnum.Ok 也是明天,但还需要其他信息。 我需要掩盖枚举值,而又不影响它的当前行为,这可能来自任何通用参考。

someEnumVariable.ToString()
(int)someEnumVariable
someVar = SomeEnum.Ok
Enum.Parse(typeOf(SomeEnum), someString)

如果我用以下方式标记枚举

var test = (SomeEnum.Ok | SomeEnum.Blocking);
可以创建两个标志,即test.HasFlags(SomeEnum.Ok)test.HasFlags(SomeEnum.Blocking)但枚举表示为SomeEnum.Blocking,这是不可能的。

有任何想法吗?

http://msdn.microsoft.com/en-us/library/system.flagsattribute.aspx

我认为对二进制OR的快速介绍是适当的。

| 不仅让您将两个整数潜入一个变量。 它执行数学运算。

因此,除0以外的任何值与0进行“或”运算都会返回该值本身。

如果您提供的标志值不是单个位,例如1、2、4、8、16,则可能会遇到进一步的意外行为。

编辑

如果要围绕现有值构建一个Flags枚举,则可以这样做。 不要将当前保留的位10001(17)用于任何其他值,并且在测试Ok时要小心。

因为SomeEnum.OK值为0,所以调用HasFlag(SomeEnum.OK)始终返回true。 将枚举一起屏蔽时,该过程依赖于以下事实:枚举值的任何组合的总和将是唯一的。 通常,您将从2^0 2^1 2^2等值开始设置这些。例如:

[Flags]
public enum SomeEnum : short
{ 
    Ok = 1,
    Missing = 2,
    Blocking = 4, // Values could be anything
    Low  = 8,     // Values could be anything
}

如果要一起屏蔽这些值,则必须使用Flags属性。 如果您不能重构和更改SomeEnum.OK的值,则可能必须依靠传递SomeEnum[] ,而不是传递单个蒙版的SomeEnum值。

编辑
关于使用上面定义的枚举一起掩盖值的简要说明。 采取以下代码:

var t1 = (int)(SomeEnum.OK | SomeEnum.Missing);       //t1 = 1 + 2 = 3
var t2 = (int)(SomeEnum.Missing | SomeEnum.Blocking); //t2 = 2 + 4 = 6
var t3 = (int)(SomeEnum.OK | SomeEnum.Low);           //t3 = 1 + 8 = 9
var t4 = (int)SomeEnum.OK;                            //t4 = 1
var s1 = (SomeEnum.Ok).ToString();                    //s1 = "Ok"
var s2 = (SomeEnum.Ok | SomeEnum.Missing).ToString(); //s2 = "Ok, Missing"

将这些项目进行“或”运算时,.NET只会将这些值加在一起以产生一个新的唯一值,该值代表“或”项的组合。 使用2的幂的枚举值可确保组合始终是唯一的。

这是一个如何使用位标​​记完成此操作的示例。 但是,这可能会迫使您更改现有的标志比较。

 [FlagsAttribute] 
enum tester
{
    alpha = 1,
    beta = 2,
    gamma = 4,
    reggy=3
}

class Program
{
    static void Main(string[] args)
    {
        tester t = tester.alpha | tester.beta;
        if (t == tester.alpha)
            Console.WriteLine("alpha only");
        if ((t & tester.alpha) != 0)
            Console.WriteLine("alpha");
        if ((t & tester.beta) != 0)
            Console.WriteLine("beta");
        if ((t & tester.gamma) != 0)
            Console.WriteLine("gamma");
        if (t == (tester.beta | tester.alpha))
            Console.WriteLine("alphabeta");

        //this will produce alpha, beta, alphabeta

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM