.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
相关产品推荐
相关产品推荐

