一尘不染

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

c#

我建立一个功能扩展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

足够公平,但是有没有允许通用枚举的解决方法,或者我将不得不模仿该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#中发布了由编译器强制执行的类型安全的通用解决方案,这很值得一看,并值得一提。如果解决方案在页面上冒泡,我将删除此编辑。


阅读 275

收藏
2020-05-19

共1个答案

一尘不染

由于EnumType实现了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。机会虽然很少。

2020-05-19