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

问题描述 投票:0回答:8

(好吧,我就在这里暴露我的无知之深,请温柔一点)

背景

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

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

EnumInterpreter是一个Func,在创建父类时传入。

我使用枚举是因为在这个级别它“不关我的事”——我不在乎它是哪个特定的枚举。调用代码仅使用(生成的)枚举来避免魔术字符串。

问题

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

c# .net enums casting
8个回答
59
投票

System.Enum 不能直接转换为 Integer,但它确实显式实现了 IConvertible,这意味着您可以使用以下内容:

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

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


9
投票

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

可以通过如下方式获取值,但是很难看:

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

4
投票

试试这个..

m_EnumInterpreter((int) (object) enumVal);


2
投票

对我来说,首先转换为对象就足够了,因为这只是一个编译错误。

public static int AsInt(this Enum @this)
{
  return (int)(object)@this;
}

1
投票

这里有各种东西:

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

2)您还可以考虑使用 Enum 类的成员,例如 .GetName()、.GetValue() 等,因为它们直接处理独立于枚举类型的定义名称和值。

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

4) 从你的变量命名来看,你似乎有 C++/MFC 背景。您可能想了解 C# 风格的命名约定,这会让您在使用/阅读其他人的代码和库时感到轻松。查看 MS 的 StyleCop 以获得一个很好的插件来帮助命名。


1
投票

我不知道是否应将其包含在我的问题中或作为答案。问题是这不是答案,但它是对我有用的答案。

我在尝试其他东西时偶然发现,如果我只是将它塞到绳子的末端,我就会得到我想要的:

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

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

我不确定其他三个答案中哪一个是“正确的”,所以投票掉......


0
投票

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

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

希望这对某人有帮助。双铸 FTW。


-6
投票

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

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

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

我认为

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

© www.soinside.com 2019 - 2024. All rights reserved.