代码之家  ›  专栏  ›  技术社区  ›  Richard

为可空枚举添加约束

  •  5
  • Richard  · 技术社区  · 14 年前

    public static T ConvertStringToEnumValue<T>(string valueToConvert, bool isCaseSensitive)
    {
        if (typeof(T).BaseType.FullName != "System.Enum" && typeof(T).BaseType.FullName != "System.ValueType")
        {
           throw new ArgumentException("Type must be of Enum and not " + typeof (T).BaseType.FullName);
        }
    
        if (String.IsNullOrWhiteSpace(valueToConvert))
          return (T)typeof(T).TypeInitializer.Invoke(null);
    
        valueToConvert = valueToConvert.Replace(" ", "");              
    
        if (typeof(T).BaseType.FullName == "System.ValueType")
        {
            return (T)Enum.Parse(Nullable.GetUnderlyingType(typeof(T)), valueToConvert, !isCaseSensitive);
        }
    
        return (T)Enum.Parse(typeof(T), valueToConvert, !isCaseSensitive);
    }
    

    我这样称呼它:

    EnumHelper.ConvertStringToEnumValue<Enums.Animals?>("Cat");
    

    我现在想把T的约束添加到一个枚举中,比如(我从 Stackoverflow article ): where T : struct, IConvertible 但是我遇到了一些问题,因为T需要能够获取可为null的枚举。错误消息显示:

    类型'枚举。动物?' 必须是不可为null的值类型,才能将其用作泛型类型或方法中的参数“T”

    有没有办法做到这一点,或者我需要仅仅依赖于我在方法中的运行时检查?

    2 回复  |  直到 7 年前
        1
  •  9
  •   Jon Skeet    14 年前

    但是,一种选择是将方法分为:

    public static T ConvertStringToEnumValue<T>(...) where T : struct
    public static T? ConvertStringToNullableEnumValue<T>(...) where T : struct
    

    当然,我们不知道您将如何使用此代码-但是如果您要调用它 对于非泛型方法,这将是我建议的方法。

    当然,这仍然不能阻止有人用 T=int 或者类似的。。。你可能想看看 Unconstrained Melody 更严格的约束。

        2
  •  1
  •   Bear Monkey    14 年前