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

.Net Framework 4.8中Enum.GetValues转System.Enum遇异常问题

问题分析与解决

你的代码抛出InvalidCastException的核心原因是:枚举的底层类型不一定是int。

Convert.ChangeType(e, e.GetTypeCode())返回的是枚举对应底层类型的实例(比如如果枚举定义为enum MyEnum : byte { ... },返回的就是byte类型值;如果是enum MyEnum : uint { ... },返回的就是uint类型值)。当你直接把这些非int类型的值强转为int时,就会因为类型不匹配触发异常。

解决方法

方法一:直接用Convert.ToInt32处理

Convert.ToInt32可以自动兼容枚举的各种底层类型(只要枚举值在int的取值范围内),代码更简洁:

var enumConstants =
    Enum.GetValues(enumType)
        .Cast<Enum>()
        .Select(e => new SomeClass { Value = Convert.ToInt32(e), ... }).ToList();

方法二:先转底层类型再转int(更严谨)

如果需要先明确处理枚举的底层类型,可以先获取底层类型再转换,避免潜在的类型转换问题:

var underlyingType = Enum.GetUnderlyingType(enumType);
var enumConstants =
    Enum.GetValues(enumType)
        .Cast<Enum>()
        .Select(e => 
        {
            var underlyingValue = Convert.ChangeType(e, underlyingType);
            return new SomeClass { Value = (int)Convert.ChangeType(underlyingValue, typeof(int)), ... };
        }).ToList();

注意:如果你的枚举底层类型是ulong且值超过int.MaxValue,或者uint值超过int.MaxValue,转int会抛出溢出异常。这种情况下你需要根据业务需求调整SomeClass.Value的类型(比如改成long),或者做额外的范围校验。

内容的提问来源于stack exchange,提问作者Yusif

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 20:25:46