[英]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.