提问人:Stephan 提问时间:11/12/2023 最后编辑:Stephan 更新时间:11/12/2023 访问量:33
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?
问:
我想在程序中使用不同的值并动态显示不同的值/选项enums
在这个例子中,我看了两个不同的,我想稍后使用它们并展示它们的潜在价值,我该怎么做?但我希望这对所有人都有效,而不仅仅是这两个。
这是我的例子:enums
enums
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
它适用于该枚举,但显然不适用于其他枚举。
那么,我该如何编写它以在运行时获取任何枚举的值呢?
答:
1赞
jamesdlin
11/12/2023
#1
无法动态检索类型的值。相反,您需要执行以下操作之一:Enum
将值列表作为附加参数:
FancyPrint
Enum
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 只使用一组固定的类型。例如,类似以下内容:
FancyPrint
Enum
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'); } }
使用一组可以在运行时构建的类型:
FancyPrint
Enum
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 的工作方式。类的方法和属性等效于具有类作用域的全局函数,并且不是类接口的一部分。由于它们不是接口的一部分,因此没有虚拟调度可以在运行时动态访问它们。
上一个:如何使用mapster映射枚举
评论