我正在构建一个函数来扩展Enum.Parse
概念
所以我写了以下内容:
public static T GetEnumFromString<T>(string value, T defaultValue) where T : Enum{if (string.IsNullOrEmpty(value)) return defaultValue;foreach (T item in Enum.GetValues(typeof(T))){if (item.ToString().ToLower().Equals(value.Trim().ToLower())) return item;}return defaultValue;}
我得到一个错误约束不能是特殊类System.Enum
。
很公平,但是有没有一种解决方法可以允许泛型枚举,或者我必须模仿Parse
函数并将类型作为属性传递,这会将丑陋的装箱要求强制到您的代码中。
编辑下面的所有建议都非常感谢,谢谢。
已经确定(我已经离开了循环以保持不区分大小写-我在解析XML时使用它)
public static class EnumUtils{public static T ParseEnum<T>(string value, T defaultValue) where T : struct, IConvertible{if (!typeof(T).IsEnum) throw new ArgumentException("T must be an enumerated type");if (string.IsNullOrEmpty(value)) return defaultValue;
foreach (T item in Enum.GetValues(typeof(T))){if (item.ToString().ToLower().Equals(value.Trim().ToLower())) return item;}return defaultValue;}}
编辑:(2015年2月16日)克里斯多夫货币已经发布了编译器在MSIL或F#中强制执行类型安全的泛型解决方案下面,这是非常值得一看,并赞成。
编辑2:(2021年4月13日)由于这个问题现在已经得到解决和支持,自C#7.3以来,我已经改变了接受的答案,尽管为了学术和历史兴趣,充分阅读顶级答案是值得的:)