我可以在 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# 中从泛型类型转换为枚举吗?的主要内容,如果未能解决你的问题,请参考以下文章