ListAllBitNamesinaFlagsEnum).我想要一个方法,它将返回在某个变量中设置的所有枚举值的列表。在我的例子中[Flag]EnumHWResponse{None=0x0,Ready=0x1,Working=0x2,Error=0x80,}我给它0x81,它应该给我一个包含{Ready,Error}的IEnumerable。由于找不到更简单的方法,我尝试编写下面的代码,但无法编译。publicstaticIEnumerableMaskToList(Enummask){if(typeof(T).IsSubclassOf(typeof(Enum))==false)thrownewArgumentException();Listtoreturn=newList(100);foreach(TcurValueBitinEnum.GetValues(typeof(T)).Cast()){枚举位=((Enum)curValueBit);//这里是错误if(mask.HasFlag(bit))toreturn.Add(curValueBit);返回返回;}在这个版本的代码中,编译器抱怨它不能将T转换为Enum。我做错了什么?有更好(更简单)的方法吗?我怎么投?此外,我尝试将该方法编写为publicstaticIEnumerableMaskToList(Enummask)whereT:Enum但Enum是一种特殊类型,它禁止使用“where”语法(使用C#4.0)这是使用LINQ编写它的简单方法:publicstaticIEnumerableMaskToList(Enummask){if(typeof(T).IsSubclassOf(typeof(Enum))==false)thrownewArgumentException();返回Enum.GetValues(typeof(T)).Cast().Where(m=>mask.HasFlag(m)).Cast();如果您想要的最终结果是名称字符串列表,只需调用mask.ToString()。如果枚举是这样定义的,你会怎么做:[Flags]enumState{Ready=1,Waiting=2,ReadyAndWaiting=3}至于解决编译器错误,应该这样做:Enumbit=(Enum)(object)curValueBit;JonSkeet有一个名为UnconstrainedMelody的项目,它允许您通过在编译后重写IL来添加枚举约束。这是可行的,因为CLR支持此类约束,即使C#不支持。另一个想法:将GetValues的返回值直接转换为T[]会更高效:foreach(TcurValueBitin(T[])Enum.GetValues(typeof(T)))建立在Gabe的回答上,我来了加上这个:publicstaticclassEnumHelperwhereT:struct{//ReSharperdisableStaticFieldInGenericTypeprivatestaticreadonlyEnum[]Values;//ReSharper恢复StaticFieldInGenericTypeprivatestaticreadonlyTDefaultValue;staticEnumHelper(){vartype=typeof(T);如果(type.IsSubclassOf(typeof(Enum))==false){thrownewArgumentException();}Values=Enum.GetValues(type).Cast().ToArray();默认值=默认值(T);}publicstaticT[]MaskToList(Enummask,boolignoreDefault=true){varq=Values.Where(mask.HasFlag);如果(ignoreDefault){q=q.Where(v=>!v.Equals(DefaultValue));}返回q.Cast().ToArray();我组织的事情有点不同,即我进行类型检查(即:validationT实际上是一个枚举)并在静态构造函数中获取枚举值,因此它只完成一次(这将是一个性能改进)。另外,我添加了一个可选参数,因此您可以忽略枚举的典型“零”/“无”/“不适用”/“未定义”/等值。如果你只是做这样的事情会怎样:Listtoreturn=newList(100);foreach(TcurValueBitinEnum.GetValues(typeof(T)).Cast()){枚举位=(curValueBitasEnum);//唯一的区别实际上在这里,//使用“as”,而不是(Enum)castif(mask.HasFlag(bit))toreturn.Add(curValueBit);返回返回;}因为没有编译时检查。编译器只是“信任”您并希望您知道自己在做什么,因此不会引发编译时错误。以上就是C#学习教程:列举flag枚举中的所有位名称,分享全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
