我可以在 C# 中从泛型类型转换为枚举吗?

Posted

技术标签:

【中文标题】我可以在 C# 中从泛型类型转换为枚举吗?【英文标题】:Can I cast from a generic type to an enum in C#? 【发布时间】:2010-07-15 23:06:42 【问题描述】:

我正在编写一个实用函数,它从数据库中获取一个整数并将一个类型化的枚举返回给应用程序。

这是我尝试做的(注意我在我的真实函数中传递了一个数据读取器和列名而不是int):

public static T GetEnum<T>(int enumAsInt)

    Type enumType = typeof(T);

    Enum value = (Enum)Enum.ToObject(enumType, enumAsInt);
    if (Enum.IsDefined(enumType, value) == false)
    
        throw new NotSupportedException("Unable to convert value from database to the type: " + enumType.ToString());
    

    return (T)value;

但它不会让我投 (T)value 说:

无法将类型“System.Enum”转换为“T”。

我还阅读了很多关于使用Enum.IsDefined 的混合评论。性能方面听起来很差。我还能如何保证有效值?

【问题讨论】:

请注意,如果情况相反,例如,您必须执行(Enum)value 并且您得到Cannot convert type 'T' to 'System.Enum',您可以只执行as 转换,例如value as Enum 不是真的(至少在我的情况下),你会得到旧的'as 运算符必须与引用或可为空的类型一起使用('Foo.bar' 是不可为空的值类型)错误. 【参考方案1】:

像这样:

return (T)(object)value;

【讨论】:

最好先将value 声明为object 感谢这似乎编译。那我不明白错误的原因?如果您能出于学习的兴趣解释原因,则可以加分:) 编译器没有意识到T 是一个枚举类型。据它所知,T 可能是DateTime。因此,您不能直接从object 以外的任何类型转换为T @贾斯汀:Yes; this is an annoying and unnecessary limitation 没有box-unbox就不能做到吗?可能正在使用这个__makeref 东西【参考方案2】:

改变这个:

Enum value = (Enum)Enum.ToObject(enumType, enumAsInt);

到这里:

T value = (T)Enum.ToObject(enumType, enumAsInt);

并删除演员表 :)

【讨论】:

我无法让 Slaks 解决方案工作,但使用 Enum.ToObject 演员表效果很好。【参考方案3】:

有关信息,使用通用约束 Enum 可用于 C# 7.3 及更高版本。

【讨论】:

以上是关于我可以在 C# 中从泛型类型转换为枚举吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 4.0 中,是不是可以从泛型类型参数派生类?

如何将枚举泛型类型的变量转换为 int 并返回

在 C# 中转换为泛型类型

可以将泛型类型限制为枚举吗? [复制]

c#下可否将一个枚举类型的数组转换为一个整型数组

在 C# 中从十进制转换时会失去精度吗?