如何检查值是否为枚举?

Luk*_*tti 8 dart

我想检查 dart 中的值是否是 Enum,如果是,则自动序列化它。

我的症结是如何测试一个值是否是一个枚举。

这就是我测试其他类型的方式

if (T == int)
  val = prefs.getInt(this._key);
else if (T == double)
  val = prefs.getDouble(this._key);
else if (T == bool)
  val = prefs.getBool(this._key);
else if (T == String)
  val = prefs.getString(this._key);
else if ([""] is T)
  val = prefs.getStringList(this._key);
Run Code Online (Sandbox Code Playgroud)

但我似乎无法比拟Tenum

由于所有枚举都具有相同的方法,我希望能够感知它们并相应地处理它们

Mar*_*rcG 21

截至 2021 年底,所有枚举均已扩展Enum

现在终于可以is Enum直接使用了:

enum MyEnum {one, two, three}

var x = "a";
var y = MyEnum.one;

print(x is Enum); // false
print(y is Enum); // true
Run Code Online (Sandbox Code Playgroud)

这也意味着您现在可以为枚举创建扩展:

extension EnumExtension on Enum { ... }
Run Code Online (Sandbox Code Playgroud)


Dmi*_*zak 9

如果您需要检查是dynamic值枚举类型。您可以使用下一个方法。主要思想与@Oniya Daniel 的回答非常相似。

 enum Fruit {
   banana,
   apple,
   orange,
 }
Run Code Online (Sandbox Code Playgroud)

下一个检查isEnum条件的方法

 bool isEnum(dynamic data) {
   final split = data.toString().split('.');
   return split.length > 1 && split[0] == data.runtimeType.toString();
 }
Run Code Online (Sandbox Code Playgroud)

测试结果如下

  test('check enum runtime', () {
    expect(isEnum(Fruit.banana), true);
    expect(isEnum(null), false);
    expect(isEnum(''), false);
    expect(isEnum('banana'), false);
  });
Run Code Online (Sandbox Code Playgroud)

PS:describeEnum(<enum_value>)package:flutter/foundation.dart


Oni*_*iel 1

将 转换enum为 alist并检查列表是否包含您要检查的值。

enum ObjectType {
    TypeA, TypeB
}

// checking against enum values
print(ObjectType.values.contains(ObjectType.TypeA));        // true
print(ObjectType.values.contains(ObjectType.TypeB));        // true

// checking against string value
print(ObjectType.values.contains("ObjectType.TypeA"));    // false

// checking against boolean
print(ObjectType.values.contains(false));   // false

// checking against int
print(ObjectType.values.contains(234));       // false

// checking against double
print(ObjectType.values.contains(2.345));    // false
Run Code Online (Sandbox Code Playgroud)