将一些bool属性转换为标志枚举

我需要将具有3个bool属性的遗留类转换为标记枚举。

我知道至少有一个属性是真的。

[Flags] public enum FlagEnum { EnumValue1 = 1, EnumValue2 = 2, EnumValue3 = 4 } public class LegacyClass { public bool PropA { get; set; } public bool PropB { get; set; } public bool PropC { get; set; } } public class DtoClass { public FlagEnum FlagEnum { get; set; } public DtoClass(LegacyClass legacyClass) { if (!legacyClass.PropA && !legacyClass.PropB && !legacyClass.PropC) { throw new ArgumentException(); } if (legacyClass.PropA) { FlagEnum = FlagEnum.EnumValue1; } if (legacyClass.PropB) { if (legacyClass.PropA) { FlagEnum = FlagEnum.EnumValue1|FlagEnum.EnumValue2; } else { FlagEnum = FlagEnum.EnumValue2; } } if (legacyClass.PropC) { if (legacyClass.PropA||legacyClass.PropB) { FlagEnum = FlagEnum | FlagEnum.EnumValue3; } else { FlagEnum = FlagEnum.EnumValue3; } } } } 

考虑到有人可以拥有更多属性然后设置标志,有更优雅或更好的方法吗?

—————–更新—————————

你所有的解决方案都是有效的,效果很好,所以每个人都有+1。

但我必须选择一个和我最喜欢的那个,因为它简洁易读恕我直言是Fredou的 。

感谢大家!

怎么样这样的?

 using System; namespace ConsoleApplication1 { [Flags] public enum FlagEnum { EnumValue1 = 1, EnumValue2 = 2, EnumValue3 = 4 } public static class LegacyClass { public static bool PropA { get; set; } public static bool PropB { get; set; } public static bool PropC { get; set; } } class Program { static void Main(string[] args) { LegacyClass.PropB = true; FlagEnum result = LegacyClass.PropA ? FlagEnum.EnumValue1 : 0; result |= LegacyClass.PropB ? FlagEnum.EnumValue2 : 0; result |= LegacyClass.PropC ? FlagEnum.EnumValue3 : 0; } } } 

您可以将代码算术与小函数结合使用以简化代码,而不是在代码中使用分支:

 T GetFlag(Boolean value, T flag) { return value ? flag : default(T); } 

要计算枚举值,您可以使用以下表达式:

 var flagEnum = GetFlag(legacyClass.PropA, FlagEnum.EnumValue1) | GetFlag(legacyClass.PropB, FlagEnum.EnumValue2) | GetFlag(legacyClass.PropC, FlagEnum.EnumValue3); 

请注意,如果没有设置任何标志,您的代码将抛出ArgumentException 。 此代码将改为计算default(FlagEnum) ,在本例中为0。

你必须为此使用按位运算吗? 我怀疑一种非按位方法可以在这里工作:

 FlagEnum = (FlagEnum)(1 * (ToInt(legacyClass.PropA)) + 2 * (ToInt(legacyClass.PropB)) + 4 * (ToInt(legacyClass.PropC))); 

假设我们有一个function

 int ToInt(bool b) { return b ? 1 : 0; } 

如果遗留类中的布尔值被枚举,则可以更整齐地完成 – 然后我们可以使用Math.Pow(n,2)应用公式。 但这是一个设计选择。

这个怎么样?

 public DtoClass(LegacyClass legacyClass) { if (!legacyClass.PropA && !legacyClass.PropB && !legacyClass.PropC) { throw new ArgumentException(); } FlagEnum = ((legacyClass.PropA) ? FlagEnum.EnumValue1 : FlagEnum) | ((legacyClass.PropB) ? FlagEnum.EnumValue2 : FlagEnum) | ((legacyClass.PropC) ? FlagEnum.EnumValue3 : FlagEnum); }