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

