2010-07-15 32 views
37

我在写一个实用程序函数,它从数据库中获取一个整数,并将一个枚举的枚举返回给应用程序。我可以从泛型类型转换为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的混合评论。表现明智,听起来很差。我还能如何保证有效的价值?

+0

注意,如果情形是换句话说,你必须做'(Enum)v alue'并且你得到'不能将类型'T'转换为'System.Enum',你可以只做一个'''''''',就像'Enum'一样。 – nawfal 2013-06-09 13:07:10

+1

不正确(至少在我的情况下),你会得到旧的'as运算符必须与引用或可为空的类型('Foo.bar'是不可为空值的类型)一起使用的错误。 – keithl8041 2014-02-10 12:54:54

回答

58

像这样:

return (T)(object)value; 
+3

最好将'value'声明为'object'。 – 2010-07-15 23:13:45

+0

感谢,似乎编译。我不明白错误的原因呢?奖励积分,如果你可以解释为什么为了学习:) – Justin 2010-07-15 23:20:57

+2

编译器没有意识到'T'是一个枚举类型。据了解,“T”可能是“DateTime”。因此,你不能直接从'object'到'T'以外的任何类型转换。 – SLaks 2010-07-15 23:23:47

11

更改此:

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

这样:

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

,并删除投:)

相关问题