如何在Dart中实现整数到泛型枚举的通用转换?
整数转Dart枚举的通用泛型实现方案
问题核心
你尝试直接通过泛型类型T访问values失败的原因很明确:Dart中所有枚举都继承自Enum基类,但values是每个具体枚举类静态生成的成员,并非Enum基类的属性。所以你无法通过Type类型的T或者Enum基类直接获取values集合。
可行的通用实现方案
方案1:带values参数的泛型方法(推荐)
这是最简洁且无限制的方案,利用每个枚举自带的values列表作为参数传入,无需额外依赖:
T intToEnum<T extends Enum>(int index, List<T> enumValues) { if (index < 0 || index >= enumValues.length) { throw RangeError('Index $index out of bounds for ${T.toString()}'); // 或者返回默认值:return enumValues.first; } return enumValues[index]; }
调用示例:
enum Color { red, green, blue } void main() { final color = intToEnum(1, Color.values); // 返回Color.green }
方案2:反射实现(仅限纯Dart项目)
如果你的项目是纯Dart(非Flutter,因为Flutter禁用了dart:mirrors),可以通过反射自动获取枚举的values,避免手动传入参数:
import 'dart:mirrors'; T intToEnum<T extends Enum>(int index) { final classMirror = reflectType(T) as ClassMirror; final values = classMirror.getField(#values).reflectee as List<T>; if (index < 0 || index >= values.length) { throw RangeError('Invalid index for ${T.toString()}'); } return values[index]; }
调用示例:
enum Size { small, medium, large } void main() { final size = intToEnum<Size>(2); // 返回Size.large }
注意:反射会带来性能开销,且Flutter不支持该方案,仅适合纯Dart工具类或后端项目。
为什么你的初始尝试无效
- 写
T == Enum没有意义,因为T是具体的枚举类型(比如MyEnum),和Enum基类不是同一类型。 Enum基类没有values静态属性,只有每个具体枚举类才会自动生成这个静态列表,所以(T as Enum).values这种写法本质上是错误的。
内容的提问来源于stack exchange,提问作者Chris Nadovich
相关产品推荐
相关产品推荐

