3

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

它确实可以编译,但我认为它是错误的,因为枚举不是结构?如果是这样,我如何限制通用方法说我期待一个 ValueType 你不必向我抱怨“只有不可为空的值类型可能是 '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;
}
4

2 回答 2

4

不幸的是,C# 中没有可用的约束允许您限制给定类型是枚举。但在 IL 中有这样的概念。乔恩在博客中谈到了它

于 2012-07-30T10:07:00.323 回答
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;
    }

结果,您将获得具体枚举列表

于 2012-07-31T00:30:28.760 回答