我有一个Enum和一个从String创建它的函数,因为我找不到一种内置的方法来做到这一点

enum Visibility{VISIBLE,COLLAPSED,HIDDEN}

Visibility visibilityFromString(String value){
  return Visibility.values.firstWhere((e)=>
      e.toString().split('.')[1].toUpperCase()==value.toUpperCase());
}

//used as
Visibility x = visibilityFromString('COLLAPSED');

但是似乎我必须为我拥有的每个Enum重写这个函数,有没有一种方法可以编写同样的函数,其中它接受Enum类型作为参数?我试过了,但我发现我不能强制转换为Enum.

//is something with the following signiture actually possible?
     dynamic enumFromString(Type enumType,String value){

     }

推荐答案

使用镜子,你可以强迫某些行为.我有两个 idea .遗憾的是,DART不支持类型化函数:

import 'dart:mirrors';

enum Visibility {VISIBLE, COLLAPSED, HIDDEN}

class EnumFromString<T> {
  T get(String value) {
    return (reflectType(T) as ClassMirror).getField(#values).reflectee.firstWhere((e)=>e.toString().split('.')[1].toUpperCase()==value.toUpperCase());
  }
}

dynamic enumFromString(String value, t) {
  return (reflectType(t) as ClassMirror).getField(#values).reflectee.firstWhere((e)=>e.toString().split('.')[1].toUpperCase()==value.toUpperCase());
}

void main() {
  var converter = new EnumFromString<Visibility>();

  Visibility x = converter.get('COLLAPSED');
  print(x);

  Visibility y = enumFromString('HIDDEN', Visibility);
  print(y);
}

输出:

Visibility.COLLAPSED
Visibility.HIDDEN

Dart相关问答推荐

什么相当于 dart 中的 JAVA ThreadLocal?

如何在polymer应用程序中实现主要功能

Dart 包版本如何工作以及我应该如何对我的 Flutter 插件进行版本控制?

如何从 Flutter App 连接 Ms SQL?

如何使用Flutter在按钮网格中滑动(swipe)/拖动(drag) 2 个或更多按钮

如何在没有 Scaffold.drawer 的情况下使用 Drawer?

如何使用Flutter dio 下载文件?

Flutter 扩展方法不起作用,它说undefined class和requires the extension-methods language feature

访问用户环境变量

Dart:Streams与 ValueNotifiers

如何在 Flutter 中管理 Firebase 身份验证状态?

将DateTime转换为ISO 8601

如何在 URL 中获取查询参数

在 Dart 中将 List 转换为字符串?

什么是健全的编程语言?

如何在 Dart 中从外部查询 shadow DOM 中的元素?

Dart 有没有办法测量小代码的执行时间

Null aware函数调用运算符

在 Dart 中为数字添加前导零

如何在 Dart 中运行重复出现的函数?