Dart:当我在编译时不知道它是哪个枚举时,我如何在 dart 中获取枚举的值?

Dart: How can I get the values of an enum in dart when I do not know at compile time which enum it will be?

提问人:Stephan 提问时间:11/12/2023 最后编辑:Stephan 更新时间:11/12/2023 访问量:33

问:

我想在程序中使用不同的值并动态显示不同的值/选项enums

在这个例子中,我看了两个不同的,我想稍后使用它们并展示它们的潜在价值,我该怎么做?但我希望这对所有人都有效,而不仅仅是这两个。 这是我的例子:enumsenums

enum ABC {a, b, c}

enum ThreeNumbers {one, two, three}

void main() {
  print('----');
  FancyPrint(ABC.a);
  print('----');
  FancyPrint(ThreeNumbers.two);
  print('----');
}

class FancyPrint{
  Enum input;
  
  FancyPrint(this.input){
    
    for(final v in WHATEVER_ENUM_THIS_IS.values){
      print('${v == input ? 'x' : '-'} $v');
    }
  }
}

我希望输出为:

----
x ABC.a
- ABC.b
- ABC.c
----
- ThreeNumbers.one
x ThreeNumbers.two
- ThreeNumbers.three
----

如果我写而不是

final v in WHATEVER_ENUM_THIS_IS.values

代码

final v in ABC.values

它适用于该枚举,但显然不适用于其他枚举。

那么,我该如何编写它以在运行时获取任何枚举的值呢?

Dart 枚举

评论


答:

1赞 jamesdlin 11/12/2023 #1

无法动态检索类型的值。相反,您需要执行以下操作之一:Enum

  • 将值列表作为附加参数:FancyPrintEnum

    enum ABC { a, b, c }
    
    enum ThreeNumbers { one, two, three }
    
    void fancyPrint<E extends Enum>(E input, Iterable<E> values) {
      for (final v in values) {
        print('${v == input ? 'x' : '-'} $v');
      }
    }
    
    void main() {
      print('----');
      fancyPrint(ABC.a, ABC.values);
      print('----');
      fancyPrint(ThreeNumbers.two, ThreeNumbers.values);
      print('----');
    }
    
  • Make 只使用一组固定的类型。例如,类似以下内容:FancyPrintEnum

    void fancyPrint<E extends Enum>(E input) {
      Iterable<Object> values = switch (E) {
        ABC => ABC.values,
        ThreeNumbers => ThreeNumbers.values,
        _ => throw ArgumentError('Unrecognized Enum type: $E'),
      };
    
      for (final v in values) {
        print('${v == input ? 'x' : '-'} $v');
      }
    }
    
  • 使用一组可以在运行时构建的类型:FancyPrintEnum

    final enumValues = <Type, Iterable<Enum>>{};
    
    void fancyPrint<E extends Enum>(E input) {
      var values = enumValues[E];
      if (values == null) {
        throw ArgumentError('Unrecognized Enum type: $E');
      }
    
      for (final v in values) {
        print('${v == input ? 'x' : '-'} $v');
      }
    }
    
    void main() {
      enumValues[ABC] = ABC.values;
      enumValues[ThreeNumbers] = ThreeNumbers.values;
    
      print('----');
      fancyPrint(ABC.a);
      print('----');
      fancyPrint(ThreeNumbers.two);
      print('----');
    }
    

评论

0赞 Randal Schwartz 11/12/2023
第二颗子弹尖叫着成为一种模式。:)
0赞 jamesdlin 11/12/2023
@RandalSchwartz 哎呀,打得好。此外,使用 -expression 是尖叫的。固定。switch
0赞 Stephan 11/13/2023
非常感谢,@jamesdlin!您写道:“无法动态检索 Enum 类型的值。 - 为什么,我在哪里可以了解有关背景的更多信息,您能为我指出正确的方向来理解这些限制吗?
0赞 jamesdlin 11/13/2023
@Stephan 这就是 Dart 的工作方式。类的方法和属性等效于具有类作用域的全局函数,并且不是类接口的一部分。由于它们不是接口的一部分,因此没有虚拟调度可以在运行时动态访问它们。