Generic Nullable Enum

时间:2012-07-30 10:04:28

标签: c# generics enums nullable

我想有一个方法可以从可空的数据库列解析枚举。 我在下面编写了这个方法(并且必须将T限制为一个结构以使其编译)。

它确实编译,但我认为它的错误,因为枚举不是结构? 如果是这样,我如何限制泛型方法说我期待一个你不必向我抱怨的ValueType"只有非可空的值类型可能是' System.Nullable&的基础#39;

private static T? ParseEnum<T>(DataRow row, string columnName)
    where T : struct
{
    T? value = null;
    try
    {
        if (row[columnName] != DBNull.Value)
        {
            value = (T)Enum.Parse(
                typeof(T),
                row[columnName].ToString(),
                true);
        }
    }

    catch (ArgumentException) { }

    return value;
}

2 个答案:

答案 0 :(得分:3)

不幸的是,C#中没有可用的限制,允许您限制给定类型是枚举。在IL中有这样的概念。乔恩blogged about it

答案 1 :(得分:1)

我认为您可以尝试使用动态并在运行时创建枚举的枚举列表

    public static dynamic ToValues(this Type enumType)
    {
        var values = Enum.GetValues(enumType);
        Type list = typeof(List<>);
        Type resultType = list.MakeGenericType(enumType);
        dynamic result =  Activator.CreateInstance(resultType);
        foreach (var value in values)
        {
            dynamic concreteValue = Enum.Parse(enumType, value.ToString());
            result.Add(concreteValue);
        }
        return result;
    }

因此,您将拥有具体枚举列表