(好吧,我就在这里暴露我的无知之深,请温柔一点)
背景
我有一个看起来(有点)像这样的方法:
public void AddLink(Enum enumVal)
{
string identifier = m_EnumInterpreter(enumVal);
AddLink(identifier);
}
EnumInterpreter是一个Func
我使用枚举是因为在这个级别它“不关我的事”——我不在乎它是哪个特定的枚举。调用代码仅使用(生成的)枚举来避免魔术字符串。
问题
如果 EnumInterpreter 发回一个空字符串,我想抛出一个带有 enumVal 实际值的异常。我以为我只能转换为 int,但编译器不会有它。我究竟做错了什么? (请不要说“一切”)。
System.Enum 不能直接转换为 Integer,但它确实显式实现了 IConvertible,这意味着您可以使用以下内容:
public void AddLink(Enum enumVal)
{
string identifier = m_EnumInterpreter(Convert.ToInt32(enumVal));
AddLink(identifier);
}
请记住,如果您的枚举实际上使用的是整数以外的其他内容(例如浮点数),您将在转换时丢失非整数数据。或者显然将 Convert 调用替换为您要转换的内容(如果已知)
不,您无法将其转换为 int,因为 System.Enum 不是枚举,它只是枚举的基类。
可以通过如下方式获取值,但是很难看:
int intVar = (int)enuYourEnum.GetType().GetField("value__").GetValue(objYourEnum);
试试这个..
m_EnumInterpreter((int) (object) enumVal);
对我来说,首先转换为对象就足够了,因为这只是一个编译错误。
public static int AsInt(this Enum @this)
{
return (int)(object)@this;
}
这里有各种东西:
1)Ryan 的答案看起来不错,但是......我宁愿将 Enum 传递给枚举解释器,这样你就可以在那里完成整个 Convert.To... 。如果您知道您仅使用基于整数的枚举,则 Convert.ToInt32() 就可以了。否则,您可能想通过使用反射或尝试/捕获其他转换来添加。
2)您还可以考虑使用 Enum 类的成员,例如 .GetName()、.GetValue() 等,因为它们直接处理独立于枚举类型的定义名称和值。
3)从技术上讲,我不会将异常抛出到枚举解释器之外。如果该条件通常为真,则从枚举解释器内部抛出异常,以便该类的所有使用都将从验证中受益。或者你最终可能会重复代码。
4) 从你的变量命名来看,你似乎有 C++/MFC 背景。您可能想了解 C# 风格的命名约定,这会让您在使用/阅读其他人的代码和库时感到轻松。查看 MS 的 StyleCop 以获得一个很好的插件来帮助命名。
我不知道是否应将其包含在我的问题中或作为答案。问题是这不是答案,但它是对我有用的答案。
我在尝试其他东西时偶然发现,如果我只是将它塞到绳子的末端,我就会得到我想要的:
throw new Exception("EnumInterpreter returns empty string for enumVal=" + enumVal);
//EnumInterpreter returns empty string for enumVal=3720116125
我实际上在我的问题中简化为 int ,真正的数据类型是 uint (在这个特定的实例中)。幸运的是,鉴于我实际上只想要字符串,所以我不必担心这一点。
我不确定其他三个答案中哪一个是“正确的”,所以投票掉......
我知道这可能不是您确切问题的解决方案,但我只想发布我如何针对我正在使用的特定 API 解决此问题。
int result = (int) (ActualEnumType) MethodThatReturnsSystemEnumType( arg1, arg2 );
希望这对某人有帮助。双铸 FTW。
为什么不将枚举解析为字符串并返回实际的枚举值?
public enum MyEnum { Flower = 1, Tree = 2, Animal = 3 };
string name = MyEnum.Flower.ToString(); // returns "Flower"
我认为
.ToString()
已被弃用,我不确定新的方法。我本以为实际的枚举表示会比 int 更有用?