当前位置: 首页 > 编程语言 > C#

在.NET3.5中实现Enum.TryParse分享

时间:2023-04-10 14:16:50 C#

在.NET3.5中实现Enum.TryParse如何在.NET3.5中实现.NET4的Enum.TryParse方法?publicstaticboolTryParse(stringvalue,outTEnumresult)whereTEnum:struct我不喜欢使用try-catch来处理任何转换失败或其他非异常事件作为我应用程序正常流程的一部分,所以我.NET3.5及更早版本中的Enum.TryParse方法使用Enum.IsDefined()来确保Enum.Parse()不会抛出异常。您还可以对值进行一些空值检查,以防止在值为空时出现ArgumentNullException。publicstaticboolTryParse(stringvalue,outTEnumresult)whereTEnum:struct,IConvertible{varretValue=value==null?false:Enum.IsDefined(typeof(TEnum),值);结果=retValue?(TEnum)枚举。解析(类型(TEnum),值):默认(TEnum);返回值;很明显,这个方法不会驻留在Enum类中,所以需要一个类来包含它,这是合适的。一个限制是缺少对泛型方法的枚举约束,因此您必须考虑如何处理不正确的类型。如果TEnum不是枚举Enum.IsDefined将抛出ArgumentException,但唯一的其他选择是在运行时检查并抛出不同的异常,所以我通常不添加额外的检查,只是让这些方法中的类型检查为我处理它.我会考虑添加IConvertible作为另一个约束,只是为了帮助更多地约束类型。花费的时间比我希望的要长,但它确实有效并经过了测试。希望这个能省一些时间!privatestaticreadonlychar[]FlagDelimiter=new[]{','};publicstaticboolTryParseEnum(stringvalue,outTEnumresult)其中TEnum:struct{if(string.IsNullOrEmpty(value)){result=default(TEnum);返回假;}varenumType=typeof(TEnum);if(!enumType.IsEnum)thrownewArgumentException(string.Format("Type'{0}'isnotanenum",enumType.FullName));结果=默认值(TEnum);//尝试直接解析值if(Enum.IsDefined(enumType,value)){result=(TEnum)Enum.Parse(enumType,value);返回真;}//获取枚举的一些信息varenumValues=Enum.GetValues(enumType);如果(enumValues.Length==0)返回false;//可能不会发生,因为你不能定义空枚举?varenumTypeCode=Type.GetTypeCode(enumValues.GetValue(0).GetType());//尝试将其解析为标志if(value.IndexOf(',')!=-1){if(!Attribute.IsDefined(enumType,typeof(FlagsAttribute)))returnfalse;//值有标志但枚举没有标志//todo:缓存它以提高效率varenumInfo=newDictionary();varenumNames=Enum.GetNames(enumType);for(vari=0;i它不会是Enum上的静态方法(静态扩展方法没有意义),但它应该可以工作publicstaticclassEnumHelpers{publicstaticboolTryParse(stringvalue,outTEnumresult)whereTEnum:struct{try{result=(TEnum)Enum.Parse(typeof(TEnum),value);}catch{returnfalse;}returntrue;}}在NLog中,我们还需要Enum.TryParsefor.Net3.5我们已经实现了本文影响的基本功能(仅解析、区分大小写、不区分大小写、无标签)。这个基本实现经过了高度单元测试,因此它与Microsoft的.Net4实现具有相同的行为。代码可以在NLog上找到GitHub,单元测试也在GitHub上(xUnit)Usage(all.Netversions)-samesignatureas.Net4.0以上是C#学习教程:ImplementingEnum.TryParsein.NET3.5分享所有内容。如果是对你有用,需要详细了解C#学习教程,希望大家多多关注——EnumHelpers.TryParse(value,true,outparsedValue)//caseinsensitive//orEnumHelpers.TryParse(value,outparsedValue)本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: