【问题标题】:Generic Nullable Enum [duplicate]通用可空枚举[重复]
【发布时间】:2012-07-30 10:04:27
【问题描述】:

我希望有一个方法可以从可为空的数据库列中解析一个枚举。 我在下面编写了这个方法(并且必须将 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;
}

【问题讨论】:

  • 枚举只是顶部加糖的整数,所以它们确实是结构。

标签: c# generics enums nullable


【解决方案1】:

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

【讨论】:

【解决方案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;
    }

因此,您将获得具体枚举列表

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多