动态获取对象的is-a关系

时间:2016-12-29 22:11:46

标签: inheritance types dart

我正在研究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贡献者讨论的)

1 个答案:

答案 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
}