C#遍历枚举时同时获取字符串与整数值报错问题
搞定枚举遍历转int报错的问题
嘿,这个问题我之前也碰到过,咱们先理清楚根源,再给你靠谱的解决方案:
首先,你遇到的Cannot convert type System.String to integer异常,说明代码里某个地方把字符串当成枚举值来转int了,但Enum.GetValues(typeof(Flow))返回的明明是Flow枚举类型的数组啊,每个元素都是Flow实例,不是string。大概率是代码里的类型推断或者转换逻辑出了小疏漏,咱们来修正:
正确的遍历写法
先贴能正常跑的代码,你可以直接用:
// 你的枚举定义 public enum Flow { All = 0, One = 1 } // 假设FlowType是这样的实体类 public class FlowType { public int FlowId { get; set; } public string FlowName { get; set; } } // 正确的遍历逻辑 var Flows = new List<FlowType>(); // 这里明确指定循环变量类型为Flow(var其实也能自动推断,但写清楚更不容易出错) foreach (Flow flow in Enum.GetValues(typeof(Flow))) { Flows.Add(new FlowType() { FlowId = (int)flow, // 直接把Flow枚举转int,完全合法 FlowName = flow.ToString() // 用ToString()拿枚举名称,比强制转string更靠谱 }); }
为啥你的代码会报错?
你说转int报错但转string没问题,这说明你的flow变量实际是string类型,而不是Flow枚举。可能的原因有这几个:
- 手滑把
Enum.GetValues写成了Enum.GetNames(GetNames返回的是枚举名称的字符串数组,比如["All", "One"]) - 在某些动态类型场景或者反射误用中,
flow被隐式转成了string - 代码里有其他隐性的类型转换,导致
flow的类型跑偏了
额外小技巧:更安全的转换
如果担心枚举底层类型不是int(虽然默认是,但万一后续改了呢),可以用Convert.ToInt32(flow)或者通过Enum.GetUnderlyingType(typeof(Flow))来获取底层类型再转换,不过对你这个场景,直接(int)flow就足够用了。
要是以后想给枚举加自定义显示名称(比如把All改成“全部”),可以给枚举值加[Display(Name = "全部")]特性,再通过反射读取就行。
内容的提问来源于stack exchange,提问作者buff
相关产品推荐
相关产品推荐

