我可以在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);