Dart Mirror API:获取反射调用的结果

时间:2013-02-23 15:32:18

标签: dart dart-mirrors

镜子返回期货会极大地限制你可以用它们做什么。

例如,

class ObjectA {
  methodA(){}
  methodB(){}
}

class DynamicWrapper extends MagicalDynamicWrapper {
  ObjectA real;
  Map<String, Function> methods;
  DynamicWrapper(this.real, this.methods);
}

var w = new DynamicWrapper(new ObjectA(), {"methodB" : (){ 'do something' }});
w.methodA() // calls ObjectA.methodA
w.methodB() // calls 'do something'

我通常采用的方法是在MagicalDynamicWrapper中定义noSuchMethod:

  • 将检查方法映射中是否存在具有此类名称的方法,然后调用它。
  • 如果没有,它将通过反射调用“真实”对象。

不幸的是,调用真实对象总会返回未来。所以它不起作用。

在某些时候,可以获得Future的值(使用值getter),但是getter不再可用。

我的问题:

有没有办法同步获得反射调用的结果?

在分布式设置中,期货肯定是要走的路。但是在非分布式设置中,所有元信息都可用,应该可以获得反射调用的值。我会为测试框架和构建工具的作者带来巨大的变化。

2 个答案:

答案 0 :(得分:2)

  

让镜子回归期货当然有道理

不,不是(好吧,至少不是我:-))。它可能会被更改,请参阅http://dartbug.com/4633#c17

  

我通常这样做的方法是在MagicalDynamicWrapper中定义noSuchMethod,它将检查方法图中是否有一个带有这样名字的方法,然后调用它,如果没有,它将调用“真实” “通过反思反对。

查看InvocationMirror文档。您可以使用invokeOn方法转发方法调用:

class Proxy {
  var target;
  Map<String, Function> overrides;

  Proxy(this.target, this.overrides);

  noSuchMethod(invocation) {
    if (overrides.containsKey(invocation.memberName)) {
      return overrides[invocation.memberName]();
    } else {
      return invocation.invokeOn(target);
    }
  }
}
  

有没有办法同步获得反射调用的结果?

不,不是。不是现在。如果您愿意,可以为http://dartbug.com/4633加注星标。

答案 1 :(得分:1)

目前您可以使用deprecatedFutureValue(aFuture)。显而易见,他们不鼓励使用它,它最终会消失,但我同意,在我们获得同步镜像API之前,你绝对需要这样的东西。