我正在研究jsonx dart到json序列化库的一个分支,以解决我曾经遇到过的一些问题。我遇到了如何动态检查对象是否为Type的问题。
例如,这个dart代码工作正常:
var s = new Set<String>();
print(s is Set); // true
但这不是:
Type t = Set;
// outputs warning: the name t is not a type and cannot be
// used in an 'is' expression
print(s is t);
(完整示例:dartpad link)
我提出的一个解决方法是为我要检查的每种类型定义一个lambda,例如,通过调用自定义lambda替换上面的s is t
,例如:({ {3}})
var isSetType = (var to_check) => to_check is Set;
然而,为我想要动态检查的每种类型创建一个lambda似乎很愚蠢。
在Java中,我可以执行以下操作(dartpad link):
Class<?> t = Set.class;
Object s = new HashSet<String>();
System.out.println(t.isInstance(s)); // true
我希望能够调用类似于Java的Class.isInstance(Object)的方法,但是类型对象dart提供的是full example。这仅仅是当前状态下语言的限制,还是有一种优雅的方式来动态检查类型?使用.runtimeType
不是一种选择,因为new Set().runtimeType == Set
为false。 (这种行为是由github上的extremely bare线程中的dart贡献者讨论的)
答案 0 :(得分:3)
如果你静态地知道类型,可以使用泛型类进行测试:
class InstanceTester<T> {
bool isInstance(o) => o is T;
}
main(){
var s = new Set<int>();
print(new InstanceTester<Set>().isInstance(s)); // true
print(new InstanceTester<Set<String>>().isInstance(s)); // false
print(new InstanceTester<Set<int>>().isInstance(s)); // true
print(new InstanceTester<Map>().isInstance(s)); // false
}