为Nullable Enum添加约束

时间:2010-09-28 08:42:24

标签: c# enums constraints nullable

我正在编写一些枚举功能,并具有以下内容:

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需要能够获取可以为空的枚举。错误消息说:

  

类型'Enums.Animals?'必须是不可为空的值类型才能在泛型类型或方法中将其用作参数“T”

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

全部谢谢!

2 个答案:

答案 0 :(得分:9)

不,没有约束说“T必须是值类型,包括可以为值的值类型。”

然而,一种选择是将方法拆分为:

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

除此之外,每个方法的实现也会更简单。

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

当然,这仍然不会阻止某人使用T=int或类似内容来调用它...您可能希望查看Unconstrained Melody以获得更严格的约束。

答案 1 :(得分:1)

有一个涉及C ++ / CLI的技巧,它允许对Enums进行通用约束。使用Enum约束在C ++ / CLI中编写基本抽象类。在C#项目中引用库并实现基类。