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

如何为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 11:53:10