通用可空枚举类型

3
我希望有一个方法,可以从可空数据库列中解析出枚举类型的值。我编写了下面这个方法(并且必须将T限制为结构体才能使其编译通过)。
它虽然可以编译通过,但我认为它是错误的,因为枚举类型不是结构体?
如果是这样的话,如何限制通用方法以表示我期望一个值类型,您无需向我抱怨“只有非空值类型可以作为'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;
}

2
枚举只是在整数上添加了一些糖,因此它们确实是结构体。 - Jens
2个回答

5

很遗憾,在C#中没有可用的约束来限制给定类型为枚举类型。但在IL中,确实有这样的概念。Jon在他的博客中提到了


2
枚举实际上是结构体。 - Artiom
1
@Artiom 枚举类型实际上是一个类!https://learn.microsoft.com/zh-cn/dotnet/api/system.enum?view=net-5.0 - Andrew_STOP_RU_WAR_IN_UA

2
我认为你可以尝试使用动态方法,在运行时创建枚举的通用列表。
    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;
    }

作为结果,您将拥有具体枚举列表。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接