为了账号安全,请及时绑定邮箱和手机立即绑定

创建将T约束为Enum的泛型方法

创建将T约束为Enum的泛型方法

慕娘9325324 2019-06-05 13:16:12
创建将T约束为Enum的泛型方法我正在构建一个函数来扩展Enum.Parse概念允许在找不到Enum值时解析默认值不区分大小写所以我写了如下: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.很公平,但是否存在允许泛型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;     }}编辑:Julien Lebosquain最近发布了编译器强制使用msil或F#中的类型安全泛型解决方案。下面,这很值得一看,并且值得一看。我将删除此编辑,如果解决方案气泡更高的页面。
查看完整描述

3 回答

?
炎炎设计

TA贡献1808条经验 获得超4个赞

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..但这种可能性很小。


查看完整回答
反对 回复 2019-06-05
  • 3 回答
  • 0 关注
  • 1531 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信