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

时间:2009-10-29 13:03:29

标签: c# .net enums casting

(好的,我会在这里揭露我无知的深度,请温柔)

背景

我有一个看起来像这样的方法:

public void AddLink(Enum enumVal)
{
     string identifier = m_EnumInterpreter(enumVal);
     AddLink(identifier);
}

EnumInterpreter是一个Func< Enum,string>在创建父类时传入。

我正在使用Enum,因为在这个级别上它“不关我的事” - 我不关心它是哪个具体的枚举。调用代码只使用(生成的)枚举来避免魔术字符串。

问题

如果EnumInterpreter发回一个空字符串,我想抛出一个带有enumVal实际值的异常。我以为我只能转换为int,但编译器不会拥有它。我究竟做错了什么? (请不要说'一切')。

7 个答案:

答案 0 :(得分:38)

System.Enum不能直接强制转换为Integer,但它确实实现了IConvertible,这意味着您可以使用以下命令:

public void AddLink(Enum enumVal)
{
    string identifier = m_EnumInterpreter(Convert.ToInt32(enumVal));
    AddLink(identifier);
}

请记住,如果您的Enum实际上使用的是Integer以外的其他内容(例如float),则转换时会丢失非整数数据。或者显然将转换调用替换为您要转换的内容(如果已知)

答案 1 :(得分:5)

不,你无法将它转换为int,因为System.Enum不是枚举,它只是枚举的基类。

编辑:

您可以按如下方式获取值,但这很难看:

int intVar = (int)enuYourEnum.GetType().GetField("value__").GetValue(objYourEnum);

答案 2 :(得分:4)

试试这个..

m_EnumInterpreter((int)(object)enumVal);

答案 3 :(得分:1)

这里有各种各样的事情:

1)Ryan的答案看起来不错,但是......我宁愿将Enum传递给enum解释器,这样你就可以完成整个Convert.To ......那里。如果您知道您使用的是仅基于整数的枚举,则Convert.ToInt32()就可以了。否则,您可能希望使用反射或尝试/捕获其他转换来添加。

2)您也可以考虑使用Enum类的成员,如.GetName(),. GetValue()等,因为它们直接处理与枚举类型无关的已定义名称和值。

3)从技术上讲,我不会在enum解释器之外抛出异常。如果该条件通常为真,则从枚举解释器内部抛出异常,以便该类的所有使用都将受益于验证。或者你最终可能会复制代码。

4)从你的变量命名来看,你似乎有一个C ++ / MFC背景。您可能希望进入C#样式命名约定,它将在使用/读取其他人的代码和库时减轻您的生活。查看MS的StyleCop是否有一个好的插件来帮助命名。

答案 4 :(得分:1)

我不知道是在我的问题中包含这个,还是作为答案。问题在于它不是答案,但它是适合我的答案。

我在尝试其他东西的过程中偶然发现的是,如果我只是把它放到一个字符串的末尾,我得到我想要的东西:

throw new Exception("EnumInterpreter returns empty string for enumVal=" + enumVal);
//EnumInterpreter returns empty string for enumVal=3720116125

我实际上在我的问题中简化为int,真正的数据类型是uint(在这个特定的实例中)。幸运的是,鉴于我实际上只想要字符串,我不必担心。

我不确定其他三个答案中的哪一个是'正确',所以投票反对......

答案 5 :(得分:0)

我知道这可能不是您确切问题的解决方案,但我只想发布我是如何针对我正在使用的特定API解决此问题。

int result = (int) (ActualEnumType) MethodThatReturnsSystemEnumType( arg1, arg2 );

希望这会对某人有所帮助。双重FTW。

答案 6 :(得分:-3)

为什么不将枚举解析为字符串并返回实际的枚举值?

public enum MyEnum { Flower = 1, Tree = 2, Animal = 3 };

string name = MyEnum.Flower.ToString(); // returns "Flower"

我认为.ToString()已弃用,我不确定新方法。我会认为实际的枚举表示比int更有用吗?