Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以在C#中从泛型类型强制转换为枚举吗?_C#_Generics_Casting_Enums - Fatal编程技术网

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

我可以在C#中从泛型类型强制转换为枚举吗?,c#,generics,casting,enums,C#,Generics,Casting,Enums,我正在编写一个实用函数,它从数据库中获取一个整数,并向应用程序返回一个类型化枚举 下面是我尝试做的事情(注意,我传入了一个数据读取器和列名,而不是我的实际函数中的int): publicstatict GetEnum(int-enumAsInt) { 类型enumType=typeof(T); 枚举值=(Enum)Enum.ToObject(enumType,enumAsInt); if(枚举已定义(枚举类型,值)==false) { 抛出新的NotSupportedException(“无法将

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

下面是我尝试做的事情(注意,我传入了一个数据读取器和列名,而不是我的实际函数中的
int
):

publicstatict GetEnum(int-enumAsInt)
{
类型enumType=typeof(T);
枚举值=(Enum)Enum.ToObject(enumType,enumAsInt);
if(枚举已定义(枚举类型,值)==false)
{
抛出新的NotSupportedException(“无法将值从数据库转换为类型:”+enumType.ToString());
}
返回(T)值;
}
但它不会让我说:

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

此外,我还阅读了很多关于如何使用
Enum.IsDefined
的评论。就性能而言,这听起来很糟糕。否则我如何保证有效值?

如下所示:

return (T)(object)value;
更改此项:

Enum value = (Enum)Enum.ToObject(enumType, enumAsInt);
为此:

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

并删除强制转换:)

有关信息,请使用C#7.3及更高版本中提供的通用约束
Enum

最好首先将
值声明为
对象
。感谢这似乎可以编译。那么我不明白错误的原因是什么?如果您能解释为什么出于学习的兴趣:)编译器没有意识到
t
是枚举类型,那么您将获得额外的积分。据了解,
T
可能是
DateTime
。因此,您不能直接从
对象
以外的任何类型强制转换到
T
@Justin:没有box unbox就不能这样做吗?可能正在使用此
\u makeref
注意,如果情况正好相反,例如,您必须执行
(Enum)值
,并且您得到
无法将类型“T”转换为“System.Enum”
,您只能执行
as
强制转换,如
value as Enum
。不正确(至少在我的情况下),您得到了旧的“as运算符必须与引用或可空类型一起使用('Foo.bar'是不可空的值类型)错误。我无法使Slaks解决方案工作,但使用Enum.ToObject强制转换效果很好。
T value = (T)Enum.ToObject(enumType, enumAsInt);