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

Jus*_*tin 43 c# generics enums casting

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

这是我试图做的(注意我传入数据读取器和列名而不是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;
}
Run Code Online (Sandbox Code Playgroud)

但它不会让我(T)value说:

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

我也读过很多关于使用的评论Enum.IsDefined.表现明智,听起来很糟糕.我怎样才能保证有效价值?

SLa*_*aks 67

像这样:

return (T)(object)value;
Run Code Online (Sandbox Code Playgroud)

  • 最初将`value`声明为`object`会更好. (3认同)
  • @Justin:[是的; 这是一个烦人且不必要的限制](http://stackoverflow.com/questions/1331739/enum-type-constraints-in-c/1416660#1416660) (3认同)
  • 编译器没有意识到`T`是枚举类型.据他所知,`T`可能是`DateTime`.因此,您不能直接从"object"以外的任何类型转换为"T". (2认同)

por*_*ges 17

改变这个:

Enum value = (Enum)Enum.ToObject(enumType, enumAsInt);
Run Code Online (Sandbox Code Playgroud)

对此:

T value = (T)Enum.ToObject(enumType, enumAsInt);
Run Code Online (Sandbox Code Playgroud)

并删除演员:)