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

使用Enum.GetValues出现编译错误,如何修改代码解决?

解决枚举反射转换的编译错误问题

错误原因

你遇到的问题是因为Cast<T>需要编译时已知的类型作为泛型参数,但myType1是一个Type类型的变量(仅在运行时确定类型),编译器无法将它当作类型来使用,因此抛出“变量被用作类型”的错误。

解决方案

根据你的使用场景,分两种情况处理:

场景1:编译时已知枚举类型(推荐)

如果代码里可以直接引用QBFC16Lib.ENTxnType,直接放弃反射获取Type变量,改用强类型写法,这是最简洁高效的方式:

// 方式1:使用.NET 5+引入的泛型重载Enum.GetValues<T>
var enumList = Enum.GetValues<QBFC16Lib.ENTxnType>()
    .Select(d => (d, (int)d))
    .ToList();

// 方式2:兼容旧版本的写法
var enumList = Enum.GetValues(typeof(QBFC16Lib.ENTxnType))
    .Cast<QBFC16Lib.ENTxnType>()
    .Select(d => (d, (int)d))
    .ToList();

场景2:必须动态获取枚举类型(运行时确定)

如果枚举类型只能通过字符串动态获取(比如类型名称来自配置),可以通过反射调用泛型方法,或者转为object处理:

方法1:反射调用泛版Enum.GetValues
Type myType1 = Type.GetType("QBFC16Lib.ENTxnType");
// 获取泛型方法Enum.GetValues<T>的实例
var getValuesMethod = typeof(Enum).GetMethod(nameof(Enum.GetValues), Type.EmptyTypes).MakeGenericMethod(myType1);
// 调用方法获取枚举值数组
Array enumValues = (Array)getValuesMethod.Invoke(null, null);
// 转换为包含枚举实例和对应数值的列表
var enumList = enumValues.Cast<object>()
    .Select(d => (d, Convert.ToInt32(d)))
    .ToList();
方法2:获取枚举名称与数值的配对(无需强类型实例)

如果不需要枚举的强类型实例,仅需要名称和数值的对应关系,可以用以下写法:

Type myType1 = Type.GetType("QBFC16Lib.ENTxnType");
var names = Enum.GetNames(myType1);
var values = Enum.GetValues(myType1).Cast<int>();
// 配对名称和数值
var enumList = names.Zip(values, (name, value) => (Name: name, Value: value)).ToList();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 14:52:17