Dart - 将泛型类型 (T) 限制为 Enum

atr*_*eon 12 dart flutter

有没有办法将泛型类型限制为 an enum,类似于以下内容?

class MyClass<T extends enum> {}
Run Code Online (Sandbox Code Playgroud)

喜欢的东西在C#

xba*_*laj 31

从 Dart 2.16 开始,现在可以将泛型类型限制为 Enum。

您可以通过以下方式执行此操作:

class MyClass<T extends Enum> {}
Run Code Online (Sandbox Code Playgroud)

T现在您只能传递给枚举的泛型参数MyClass

  • 很棒的功能,但仍然使用 _T_ 中的 _values_ 似乎不太可能: `T stuff&lt;T extends Enum&gt;(String s) { return T.values.firstWhere((e) =&gt; e.toString() = = s);}` 不起作用:错误消息是 getter _values_ 未定义等。 (4认同)
  • @何塞·恩里克·庞斯·菲亚斯。我认为你错过了一些东西。给定“enum Fruit {banana, apple}”,您可以编写“Fruit.values”。我在 _github.com/dart-lang_ 开了一张[票证](https://github.com/dart-lang/sdk/issues/48736)。看来我的评论是有道理的,这与另一个头脑风暴有关。只是到目前为止 Dart 还不支持它。 (2认同)
  • Enum 类在实现时仅代表枚举的值。在这种情况下,要么是香蕉,要么是苹果。但它并不代表 Fruit 枚举。这就说得通了。即:myFunction(String aString),aString是一个特定的String,而不是一个String的所有可能值。不过,拥有枚举的所有可能值会很有用。 (2认同)

JCK*_*del 8

在 Dart 中这是不可能的。我在将枚举属性转换为 SQLite 数据库(只能保存其数字类型)时遇到了同样的问题,因此我需要enum.values将整数“解析”为枚举enum.index并将枚举值转换为 int。

唯一可能的方法是将枚举转换为动态或传递枚举值。

例子:

T mapToEnum<T>(List<T> values, int value) {
  if (value == null) {
    return null;
  }

  return values[value];
}

dynamic enumToMap<T>(List<T> values, T value) {
  if (value == null) {
    return null;
  }

  return values.firstWhere((v) => v == value);
}
Run Code Online (Sandbox Code Playgroud)

所以我可以这样使用:

final SomeEnum value = SomeEnum.someValue;
final int intValue = enumToMap(SomeEnum.values, value);
final SomeEnum enumValue = mapToEnum(SomeEnum.values, value.index);
Run Code Online (Sandbox Code Playgroud)