如何为Dart的OvertimeType枚举添加多关联值(名称、描述等)
为OvertimeType枚举绑定多关联值的实现方案
下面提供两种实用的实现方式,适配你的现有代码结构:
方案一:扩展枚举+映射表(兼容原有枚举结构)
这种方式不需要修改原枚举定义,通过扩展方法和静态映射表把枚举和对应的名称、描述绑定:
import 'package:freezed_annotation/freezed_annotation.dart'; enum OvertimeType { @JsonValue(0) unknown, @JsonValue(1) normalOt, @JsonValue(2) earlyOt, @JsonValue(3) compensatoryTimeOff, @JsonValue(4) earlyCTO, @JsonValue(5) restDayOrHolidayCTO, } class OvertimeTypeInfo { final OvertimeType type; final String name; final String description; OvertimeTypeInfo(this.type, this.name, this.description); } // 给OvertimeType添加扩展方法 extension OvertimeTypeExtension on OvertimeType { // 静态映射表:枚举 -> 对应的信息 static const _infoMap = { OvertimeType.unknown: OvertimeTypeInfo(OvertimeType.unknown, "未知类型", "未定义的加班/调休类型"), OvertimeType.normalOt: OvertimeTypeInfo(OvertimeType.normalOt, "常规加班", "正常工作日延长工作时间的加班"), OvertimeType.earlyOt: OvertimeTypeInfo(OvertimeType.earlyOt, "早班加班", "早班时段的加班"), OvertimeType.compensatoryTimeOff: OvertimeTypeInfo(OvertimeType.compensatoryTimeOff, "常规调休", "用加班时长兑换的调休"), OvertimeType.earlyCTO: OvertimeTypeInfo(OvertimeType.earlyCTO, "早班调休", "早班加班兑换的调休"), OvertimeType.restDayOrHolidayCTO: OvertimeTypeInfo(OvertimeType.restDayOrHolidayCTO, "节假日调休", "休息日/节假日加班兑换的调休"), }; // 获取当前枚举对应的信息 OvertimeTypeInfo get info => _infoMap[this] ?? _infoMap[OvertimeType.unknown]!; }
使用方式
直接通过枚举调用info属性即可拿到关联数据:
void main() { final otType = OvertimeType.normalOt; print(otType.info.name); // 输出:常规加班 print(otType.info.description); // 输出:正常工作日延长工作时间的加班 }
方案二:用Freezed Union替代枚举(更贴合Freezed风格)
如果想完全利用Freezed的特性,可以把枚举替换成Freezed的union类型,每个case直接携带名称、描述属性:
首先确保已配置好Freezed的依赖和生成脚本,然后编写代码:
import 'package:freezed_annotation/freezed_annotation.dart'; part 'overtime_type.freezed.dart'; part 'overtime_type.g.dart'; @freezed class OvertimeType with _$OvertimeType { // 每个case自带json值、名称、描述 const factory OvertimeType.unknown({ @JsonValue(0) int? jsonValue, @Default("未知类型") String name, @Default("未定义的加班/调休类型") String description, }) = _Unknown; const factory OvertimeType.normalOt({ @JsonValue(1) int? jsonValue, @Default("常规加班") String name, @Default("正常工作日延长工作时间的加班") String description, }) = _NormalOt; const factory OvertimeType.earlyOt({ @JsonValue(2) int? jsonValue, @Default("早班加班") String name, @Default("早班时段的加班") String description, }) = _EarlyOt; const factory OvertimeType.compensatoryTimeOff({ @JsonValue(3) int? jsonValue, @Default("常规调休") String name, @Default("用加班时长兑换的调休") String description, }) = _CompensatoryTimeOff; const factory OvertimeType.earlyCTO({ @JsonValue(4) int? jsonValue, @Default("早班调休") String name, @Default("早班加班兑换的调休") String description, }) = _EarlyCTO; const factory OvertimeType.restDayOrHolidayCTO({ @JsonValue(5) int? jsonValue, @Default("节假日调休") String name, @Default("休息日/节假日加班兑换的调休") String description, }) = _RestDayOrHolidayCTO; // 生成json序列化方法 factory OvertimeType.fromJson(Map<String, dynamic> json) => _$OvertimeTypeFromJson(json); }
使用方式
直接访问union实例的属性即可:
void main() { final otType = OvertimeType.normalOt(); print(otType.name); // 输出:常规加班 print(otType.description); // 输出:正常工作日延长工作时间的加班 // 序列化/反序列化也能正常工作 final json = otType.toJson(); final fromJson = OvertimeType.fromJson(json); }
两种方案各有优势:方案一保留原有枚举结构,改动小;方案二更符合Freezed的设计理念,扩展性更强。
内容的提问来源于stack exchange,提问作者user21506239
相关产品推荐
相关产品推荐

