1. ホーム
  2. dart

[解決済み] 文字列から列挙

2022-11-24 04:45:36

質問

私は 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){

     }

どのように解決するのですか?

ミラーを使えば、ある動作を強制することができます。私は 2 つのアイデアを考えていました。残念ながら、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