我可以在 C# 中从泛型类型转换为枚举吗?
我正在编写一个实用程序函数,该函数从数据库获取整数并向应用程序返回类型化枚举。
这是我尝试做的事情(注意我在实际函数中传递了数据读取器和列名称而不是 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 的褒贬不一的评论。就性能而言,听起来很差。我还能如何保证有效值?
I'm writing an utility function that gets a integer from the database and returns a typed enum to the application.
Here is what I tried to do (note I pass in a data reader and column name instead of the int
in my real function):
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;
}
But it won't let me cast (T)value
saying:
Cannot convert type 'System.Enum' to 'T'.
Also I've read quite a bit of mixed reviews about using Enum.IsDefined
. Performance wise it sounds very poor. How else can I guarantee a valid value?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
像这样:
Like this:
将此:更改
为:
并删除演员表:)
Change this:
to this:
and remove the cast :)
有关信息,可以使用 C# 7.3 及更高版本中的通用约束
Enum
。For information, using the generic constraint
Enum
is available from C# 7.3 and greater.