You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:38:48