C# 泛型可空枚举

C# 泛型可空枚举,c#,generics,enums,nullable,C#,Generics,Enums,Nullable,我希望有一个方法可以从一个可为空的数据库列解析一个枚举。 我在下面编写了这个方法(必须将T限制为一个struct才能编译) 它确实可以编译,但我认为这是错误的,因为枚举不是结构? 如果是这样,我如何限制泛型方法说我需要一个ValueType?您不必向我抱怨“只有不可为null的值类型才能作为'System.nullable'的基础” private static T? ParseEnum<T>(DataRow row, string columnName) where T :

我希望有一个方法可以从一个可为空的数据库列解析一个枚举。 我在下面编写了这个方法(必须将T限制为一个struct才能编译)

它确实可以编译,但我认为这是错误的,因为枚举不是结构? 如果是这样,我如何限制泛型方法说我需要一个ValueType?您不必向我抱怨“只有不可为null的值类型才能作为'System.nullable'的基础”

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;
}
private static T?ParseEnum(数据行,字符串列名)
其中T:struct
{
T?值=空;
尝试
{
if(行[columnName]!=DBNull.Value)
{
value=(T)Enum.Parse(
类型(T),
行[columnName].ToString(),
正确的);
}
}
捕获(参数异常){}
返回值;
}

不幸的是,C语言中没有可用的约束,允许您限制给定类型是枚举。但是在IL中有这样的概念。Jon。

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

    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;
    }
公共静态动态值(此类型枚举类型)
{
var values=Enum.GetValues(enumType);
类型列表=类型(列表);
类型resultType=list.MakeGenericType(enumType);
动态结果=Activator.CreateInstance(resultType);
foreach(值中的var值)
{
dynamic concreteValue=Enum.Parse(enumType,value.ToString());
结果.增加(具体价值);
}
返回结果;
}

因此,您将有一个具体的枚举列表

枚举只是在顶部加了sugar的整数,所以它们实际上是结构,而且枚举实际上也是structs@Artiomenum实际上是一个类!