我想检查 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)
但我似乎无法比拟T成enum
由于所有枚举都具有相同的方法,我希望能够感知它们并相应地处理它们
Mar*_*rcG 21
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)
如果您需要检查是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
将 转换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)