Dart如何获得枚举的“价值”

问题描述 投票:16回答:8

在Dart中提供枚举之前,我写了一些繁琐且难以维护的代码来模拟枚举,现在想要简化它。我需要将枚举的值作为字符串获取,例如可以用Java完成,但不能。

例如,当我想要的是“星期一”时,小测试代码片段在每种情况下返回'day.MONDAY'

enum day {MONDAY, TUESDAY}
print( 'Today is $day.MONDAY');
print( 'Today is $day.MONDAY.toString()');

我是否更正为了得到'星期一'我需要解析字符串?

enums dart
8个回答
16
投票

可悲的是,你是正确的,toString方法返回"day.MONDAY",而不是更有用的"MONDAY"。您可以将其余字符串作为:

day theDay = day.MONDAY;      
print("${theDay.toString().substring(theDay.toString().indexOf('.')+1)}");

诚然,这很方便。

如果要迭代所有值,可以使用day.values来完成:

for (day theDay in day.values) {
  print(theDay);
}

14
投票

比特短一点:

String day = theDay.toString().split('.').last;

5
投票

有一个更优雅的解决方案:

enum SomeStatus {
  element1,
  element2,
  element3,
  element4,
}

const Map<SomeStatus, String> SomeStatusName = {
  SomeStatus.element1: "Element 1",
  SomeStatus.element2: "Element 2",
  SomeStatus.element3: "Element 3",
  SomeStatus.element4: "Element 4",
};

print(SomeStatusName[SomeStatus.element2]) // prints: "Element 2"

4
投票

获取枚举名称的最简单方法是flutter / foundation.dart中的标准方法

describeEnum(enumObject)

enum Day {
  monday, tuesday, wednesday, thursday, friday, saturday, sunday
}

void validateDescribeEnum() {
  assert(Day.monday.toString() == 'Day.monday');
  assert(describeEnum(Day.monday) == 'monday');
}

1
投票

我使用如下结构:

class Strings {
  static const angry = "Dammit!";
  static const happy = "Yay!";
  static const sad = "QQ";
}

0
投票

我的方法并没有根本不同,但在某些情况下可能稍微方便一些:

enum Day {
  monday,
  tuesday,
}

String dayToString(Day d) {
  return '$d'.split('.').last;
}

在Dart中,你不能自定义枚举的toString方法,所以我认为这个辅助函数解决方法是必要的,它是最好的方法之一。如果您想在这种情况下更正确,可以将返回的字符串的第一个字母设为大写。

您还可以添加dayFromString功能

Day dayFromString(String s) {
  return Day.values.firstWhere((v) => dayToString(v) == s);
}

用法示例:

void main() {
  Day today = Day.monday;
  print('Today is: ${dayToString(today)}');
  Day tomorrow = dayFromString("tuesday");
  print(tomorrow is Day);
}

0
投票

我使用这两个函数来获取枚举值的名称,反之,使用名称来获取枚举值:

String enumValueToString(Object o) => o.toString().split('.').last;

T enumValueFromString<T>(String key, List<T> values) =>
    values.firstWhere((v) => key == enumValueToString(v), orElse: () => null);

用法示例:

enum Fruits {avocado, banana, orange}
...
final banana = enumValueFromString<Fruits>('banana', Fruits.values);
print(enumValueToString(banana)); // prints: "banana"

0
投票

我得到了这个,我做了一个包:

https://pub.dev/packages/enum_to_string

还有一个方便的功能,需要enum.ValueOne并解析为“Value one

它是一个简单的小库,但它的单元测试,我欢迎任何边缘情况的添加。

© www.soinside.com 2019 - 2024. All rights reserved.