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

如何在Dart中覆写枚举的name属性?

问题描述

最小可复现代码

enum Foo {
  a,
  b;

  String get name {
    switch (this) {
      case Foo.a: return 'A';
      case Foo.b: return 'B';
    }
  }
}

void main() {
  printEnum<Foo>(Foo.values);
}

void printEnum<T extends Enum>(List<T> list) {
  for (var e in list) {
    print(e.name);
  }
}

当前输出

a
b

期望输出

A
B

提问

如何覆写枚举的name属性?

注意事项

  • 使用(e as Foo).name可解决单个枚举的问题,但项目中有大量枚举,无法逐个强转。
  • 请勿提供toUpperCase()这类简单方案,实际场景的自定义逻辑更复杂。

解决方案

首先明确核心限制:Dart 中枚举的name属性是Enum基类的final getter,无法被覆写。你在Foo中定义的同名name getter只是枚举类自身的成员,当变量被向上转型为Enum类型时,调用的依然是基类的name(即枚举常量的标识符),这就是输出不符合预期的根本原因。

针对你的需求,推荐使用统一接口+泛型约束的方式实现通用处理:

1. 定义统一接口

创建一个抽象接口,约定所有需要自定义名称的枚举必须实现该接口:

abstract class CustomNamedEnum {
  // 使用自定义名称的getter,避免与原生name冲突
  String get displayName;
}

2. 让枚举实现接口

修改枚举类,实现上述接口并编写自定义名称逻辑:

enum Foo implements CustomNamedEnum {
  a,
  b;

  @override
  String get displayName {
    switch (this) {
      case Foo.a: return 'A';
      case Foo.b: return 'B';
    }
  }
}

3. 修改通用打印函数

给泛型添加Enum & CustomNamedEnum的约束,确保可以直接调用自定义的displayName:

void printEnum<T extends Enum & CustomNamedEnum>(List<T> list) {
  for (var e in list) {
    print(e.displayName);
  }
}

void main() {
  printEnum(Foo.values);
}

最终输出

A
B

方案优势

  • 无需逐个类型强转,所有实现CustomNamedEnum的枚举都能复用printEnum函数
  • 自定义逻辑不受限,完全适配复杂的实际场景
  • 避免与原生name属性冲突,代码逻辑更清晰

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 01:30:52