C#学习教程:将一些布尔属性转换为标志枚举我知道至少有一个属性是真实的。[标志]publicenumFlagEnum{EnumValue1=1,EnumValue2=2,EnumValue3=4}publicclassLegacyClass{publicboolPropA{get;放;}publicboolPropB{得到;放;}publicboolPropC{得到;放;}}publicclassDtoClass{publicFlagEnumFlagEnum{get;放;}publicDtoClass(LegacyClasslegacyClass){if(!legacyClass.PropA&&!legacyClass.PropB&&!legacyClass.PropC){thrownewArgumentException();}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的。谢谢大家!这个怎么样?使用系统;namespaceConsoleApplication1{[Flags]publicenumFlagEnum{EnumValue1=1,EnumValue2=2,EnumValue3=4}publicstaticclassLegacyClass{publicstaticboolPropA{get;放;}publicstaticboolPropB{得到;放;}publicstaticboolPropC{得到;放;}}classProgram{staticvoidMain(string[]args){LegacyClass.PropB=true;FlagEnum结果=LegacyClass.PropA?FlagEnum.EnumValue1:0;结果|=LegacyClass.PropB?FlagEnum.EnumValue2:0;结果|=LegacyClass.PropC?FlagEnum.EnumValue3:0;}}}除了在代码中使用分支之外,您还可以使用带有小函数的算术运算来简化代码:TGetFlag(Booleanvalue,Tflag){returnvalue?标志:默认(T);}要计算枚举值,可以使用以下表达式:varflagEnum=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)));假设我们有一个函数intToInt(boolb){returnb?1:0;如果枚举遗留类中的布尔值,这可以做得更巧妙——然后我们可以使用Math.Pow(n,2)应用公式。但这是一种设计选择。这个怎么样?以上就是C#学习教程:将一些bool属性转换为flag枚举的全部内容分享。如果对大家有用,需要详细了解C#学习教程,希望大家多多关注publicDtoClass(LegacyClasslegacyClass){if(!legacyClass.PropA&&!legacyClass.PropB&&!legacyClass.PropC){抛出新的ArgumentException();}FlagEnum=((legacyClass.PropA)?FlagEnum.EnumValue1:FlagEnum)|((legacyClass.PropB)?FlagEnum.EnumValue2:FlagEnum)|((legacyClass.PropC)?FlagEnum.EnumValue3:FlagEnum);}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
