我建立一个功能扩展Enum.Parse的概念,
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。
System.Enum
足够公平,但是有没有允许通用枚举的解决方法,或者我将不得不模仿该Parse函数并将类型作为属性传递,从而将丑陋的装箱要求强加给您的代码。
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日)Julien Lebosquain最近在下面的MSIL或F#中发布了由编译器强制执行的类型安全的通用解决方案,这很值得一看,并值得一提。如果解决方案在页面上冒泡,我将删除此编辑。
由于EnumType实现了IConvertible接口,因此更好的实现应如下所示:
Enum
IConvertible
public T GetEnumFromString<T>(string value) where T : struct, IConvertible { if (!typeof(T).IsEnum) { throw new ArgumentException("T must be an enumerated type"); } //... }
这仍然允许传递实现的值类型IConvertible。机会虽然很少。