(好的,我会在这里揭露我无知的深度,请温柔)
背景
我有一个看起来像这样的方法:
public void AddLink(Enum enumVal)
{
string identifier = m_EnumInterpreter(enumVal);
AddLink(identifier);
}
EnumInterpreter是一个Func< Enum,string>在创建父类时传入。
我正在使用Enum,因为在这个级别上它“不关我的事” - 我不关心它是哪个具体的枚举。调用代码只使用(生成的)枚举来避免魔术字符串。
问题
如果EnumInterpreter发回一个空字符串,我想抛出一个带有enumVal实际值的异常。我以为我只能转换为int,但编译器不会拥有它。我究竟做错了什么? (请不要说'一切')。
答案 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更有用吗?