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

发布于 2024-09-10 02:38:54 字数 659 浏览 2 评论 0原文

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

这是我尝试做的事情(注意我在实际函数中传递了数据读取器和列名称而不是 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

对你再特殊 2024-09-17 02:38:54

像这样:

return (T)(object)value;

Like this:

return (T)(object)value;
长发绾君心 2024-09-17 02:38:54

将此:更改

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

为:

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

并删除演员表:)

Change this:

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

to this:

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

and remove the cast :)

白首有我共你 2024-09-17 02:38:54

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

For information, using the generic constraint Enum is available from C# 7.3 and greater.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文