是否可以创建通用的按位枚举“IsOptionSet()”方法?下面的代码可以很容易地传入HtmlParserOptions的集合,然后检查一个选项以查看它是否被选中。[标志]publicenumHtmlParserOptions{NotifyOpeningTags=1,NotifyClosingTags=2,NotifyText=4,NotifyEmptyText=8}privateboolIsOptionSet(HtmlParserOptionsoptions,HtmlParserOptionssingleOptions){return(options;ption&options)==Optionsingle是否可以创建一个通用版本(我想是通过在方法属性上实现一个接口)来处理任何带有Flags属性的枚举?编辑:最简单和最好的选择是升级到VS2010Beta2并使用.NET4的Enum.HasFlag方法。框架团队为Enum添加了很多不错的附加功能,使它们更好用。原始(对于当前的.NET):您可以通过传递枚举而不是泛型来做到这一点:staticclassEnumExtensions{privatestaticboolIsSignedTypeCode(TypeCodecode){switch(code){UInt16:caseTypeCode.UInt32:caseTypeCode.UInt64:returnfalse;默认值:返回真;}}publicstaticboolIsOptionSet(thisEnumvalue,Enumoption){if(IsSignedTypeCode(value.GetTypeCode())){longlongVal=Convert.ToInt64(value);longlongOpt=Convert.ToInt64(选项);返回(longVal&longOpt)==longOpt;}else{ulonglongVal=Convert.ToUInt64(value);ulonglongOpt=Convert.ToUInt64(选项);返回(longVal&longOpt)==longOpt;}}}这很完美,如下所示:classProgram{staticvoidMain(string[]args){HtmlParserOptions.NotifyEmptyText;Console.WriteLine("文本:{0}",opt1.IsOptionSet(HtmlParserOptions.NotifyText));Console.WriteLine("OpeningTags:{0}",opt1.IsOptionSet(HtmlParserOptions.Notify打开标签));控制台.ReadKey();}}上面的打印:Text:TrueOpeningTags:False然而,它的缺点是它不能保护你将两种不同类型的Enum类型传递到你必须合理使用它的例程中。好吧,有点。您不能添加约束以确保类型参数是一个“标志”枚举,并且在普通C#中您不能添加约束以确保它首先是一个枚举……但有一点点错误-pokery你可以让后者工作。它在IL中是有效约束,但在C#中不是。然后你需要做一些工作来让“和”部分起作用。我有一个名为UnconstrainedMelody的项目,它有一些有用的枚举扩展方法和一些IL重写。在这种情况下,您将使用:if(options.HasAny(optionToTest))或if(options.HasAll(optionToTest)),具体取决于您希望如何处理optionToTest实际上是多个组合标志的情况。或者,等待.NET4.0-BCL中的更改包括Enum.HasFlag,我认为它会做你想做的。publicstaticboolIsOptionSet(thisTflags,Toption)whereT:struct{if(!flagsisint)thrownewArgumentException("Flagsmustbeint");intopt=(int)(object)option;intfl=(int)(object)flags;返回(fl&选择)==选择;编辑:正如评论中所指出的,如果枚举不是int(这是枚举的默认值),这将不起作用。它可能应该被命名为其他名称来表示这一点,但对于大多数情况来说它可能“足够好”,除非您需要一组具有超过31个值的标志。以上是C#学习教程:Isitpossibletocreateageneralbitwiseenumeration'IsOptionSet()'method?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
