我正在尝试生成标记枚举的反转。以下是枚举:
[Flags]
public enum MyType
{
Unknown = 0,
A = 1 << 0,
B = 1 << 2,
C = 1 << 3,
D = 1 << 4,
E = 1 << 5,
F = 1 << 6
}
我定义了一个静态MyType mtGroup1
,其值为(A | B)
。我想生成相反的结果,不包括Unknown
。
我的解决方案:
MyType t = MyType.Unknown;
foreach (var vType in Enum.GetValues(typeof(MyType)).OfType<MyType>())
{
if ((mtGroup1 & vType) != vType)
t = t | vType; //Consolidates into a single enum, excluding unknown
}
t
的结果值为C | D | E | F
,这是期望的结果。
这种方法有效,但我希望有一种更简单的方法可以使用LINQ进行整合,如果更简单的话,其他非LINQ方式也可以接受。
谢谢!
答案 0 :(得分:2)
我的Unconstrained Melody项目让这很简单:
MyType inverse = mtGroup1.UsedBitsInverse();
该项目包含许多有用的方法(许多编写为扩展方法),这些方法使用“不可言说的”通用约束(C#编译器理解但不能用C#表示)将约束泛型类型参数限制为枚举类型或代理。通过这种方式,上面的代码可以在没有任何装箱的情况下工作 - 它实际上可以计算枚举类型的所有“有趣”位,这是第一次与Unconstrained Melody一起使用时,所以这个操作非常有效
如果您不想使用Unconstrained Melody,您可以编写自己的方法来查找枚举的“已用位”,然后使用:
MyType t = UsedBitsOfMyType & ~mtGroup1;